URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Submission Tags: phishing malicious Search All
Submission: On October 12 via api from US

Summary

This website contacted 75 IPs in 7 countries across 61 domains to perform 254 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
14 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)
3 188.40.16.106 24940 (HETZNER-AS)
4 178.19.70.100 29551 (HGCOMP-ASN)
21 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f11... 32934 (FACEBOOK)
8 2a00:1450:400... 15169 (GOOGLE)
4 13.224.190.187 16509 (AMAZON-02)
4 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)
1 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
2 6 23.37.53.21 16625 (AKAMAI-AS)
1 22 172.217.23.98 15169 (GOOGLE)
1 143.204.101.106 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
1 1 2600:9000:20e... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 18.195.39.206 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
2 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)
14 151.101.14.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
5 136.243.33.84 24940 (HETZNER-AS)
6 2.18.234.72 16625 (AKAMAI-AS)
7 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.216.48 16509 (AMAZON-02)
4 37.252.173.22 29990 (ASN-APPNEXUS)
1 2.18.234.21 16625 (AKAMAI-AS)
1 3 34.95.120.147 15169 (GOOGLE)
3 152.199.21.32 15133 (EDGECAST)
3 69.173.144.141 26667 (RUBICONPR...)
2 151.101.113.194 54113 (FASTLY)
2 6 2.16.31.65 16625 (AKAMAI-AS)
1 52.28.238.200 16509 (AMAZON-02)
2 52.219.74.84 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 9 151.101.114.2 54113 (FASTLY)
3 13.225.78.95 16509 (AMAZON-02)
7 185.22.221.117 60955 (WAVECON)
1 104.111.246.233 16625 (AKAMAI-AS)
2 62.168.44.125 5588 (GTSCE GTS...)
3 136.243.244.75 24940 (HETZNER-AS)
1 144.76.115.247 24940 (HETZNER-AS)
1 62.168.44.126 5588 (GTSCE GTS...)
9 2.18.232.7 16625 (AKAMAI-AS)
3 18.196.191.159 16509 (AMAZON-02)
14 151.101.114.49 54113 (FASTLY)
2 2 18.185.163.33 16509 (AMAZON-02)
1 1 69.173.144.136 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
1 1 172.217.22.98 15169 (GOOGLE)
2 2 46.51.201.190 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)
1 1 52.57.147.248 16509 (AMAZON-02)
1 2 85.215.5.31 6724 (STRATO ST...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 2.18.232.130 16625 (AKAMAI-AS)
1 104.16.68.69 13335 (CLOUDFLAR...)
1 23.37.55.184 16625 (AKAMAI-AS)
1 37.157.4.23 198622 (ADFORM)
1 89.163.159.103 24961 (MYLOC-AS)
1 194.213.222.29 5588 (GTSCE GTS...)
4 63.32.86.220 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 89.163.159.123 24961 (MYLOC-AS)
1 2600:9000:200... 16509 (AMAZON-02)
1 34.250.43.132 16509 (AMAZON-02)
1 1 89.163.159.101 24961 (MYLOC-AS)
1 34.248.95.73 16509 (AMAZON-02)
254 75
Apex Domain
Subdomains
Transfer
38 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
567 KB
27 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.3.damoh.giga.de
ssl.1.damoh.giga.de
462 KB
26 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
382 KB
13 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
207 KB
11 googletagservices.com
www.googletagservices.com
272 KB
9 teads.tv
a.teads.tv
sync.teads.tv
t.teads.tv
186 KB
8 google-analytics.com
www.google-analytics.com
46 KB
7 oadts.com
media.oadts.com
122 KB
7 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
4 KB
6 scorecardresearch.com
sb.scorecardresearch.com
4 KB
6 adnxs.com
ib.adnxs.com
acdn.adnxs.com
3 KB
6 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
12 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
21 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
27 KB
5 rubiconproject.com
fastlane.rubiconproject.com
pixel.rubiconproject.com
eus.rubiconproject.com
5 KB
5 meetrics.net
lb33.s400.meetrics.net
1 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 google.de
adservice.google.de
696 B
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
85 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
891 B
3 svonm.com
hgc-cf-cache-1.svonm.com
63 KB
3 adtech.de
adserver.adtech.de
417 B
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 twiago.com
a.twiago.com
608 B
2 adsrvr.org
match.adsrvr.org
892 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 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
18 KB
2 facebook.com
www.facebook.com
499 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
496 B
1 consensu.org
cmp.teads.mgr.consensu.org
1 bidswitch.net
x.bidswitch.net
347 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 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
15 KB
1 districtm.io
dmx.districtm.io Failed
cdn.districtm.io
1 adform.net
adx.adform.net Failed
track.adform.net
448 B
1 casalemedia.com
as-sec.casalemedia.com
900 B
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
459 B
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
597 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 gstatic.com
www.gstatic.com
174 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 otto.de Failed
orbidder.otto.de Failed
0 smartadserver.com Failed
prg.smartadserver.com Failed
254 61
Domain Requested by
22 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
www.googletagservices.com
14 www.giga.de www.giga.de
www.google-analytics.com
11 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
9 match.taboola.com www.giga.de
vidstat.taboola.com
9 trc.taboola.com 3 redirects cdn.taboola.com
www.giga.de
8 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
8 www.google-analytics.com www.giga.de
www.google-analytics.com
7 media.oadts.com www.giga.de
media.oadts.com
7 tpc.googlesyndication.com securepubads.g.doubleclick.net
6 sb.scorecardresearch.com 2 redirects cdn.taboola.com
www.giga.de
6 cdn.taboola.com www.giga.de
cdn.taboola.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
6 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
5 lb33.s400.meetrics.net www.giga.de
4 t.teads.tv www.giga.de
4 ib.adnxs.com cdn-a.yieldlove.com
www.giga.de
4 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 convammp.taboola.com
3 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
3 a.teads.tv www.giga.de
a.teads.tv
3 ssl.3.damoh.giga.de text
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 adserver.adtech.de cdn-a.yieldlove.com
3 ih.adscale.de www.giga.de
js.adscale.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 static.giga.de www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 acdn.adnxs.com cdn-a.yieldlove.com
2 sync.teads.tv a.teads.tv
2 a.twiago.com 1 redirects www.giga.de
2 match.adsrvr.org 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 js.adscale.de c.nativendo.de
js.stroeermediabrands.de
2 video-adserver.ibillboard.com media.oadts.com
2 t.nativendo.de c.nativendo.de
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 c.nativendo.de d.nativendo.de
c.nativendo.de
2 d.nativendo.de www.giga.de
c.nativendo.de
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
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 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 cmp.teads.mgr.consensu.org a.teads.tv
1 imprammp.taboola.com www.giga.de
1 x.bidswitch.net 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 tracker-adserver.ibillboard.com www.giga.de
1 ssl.1.damoh.giga.de text
1 native.adscale.de c.nativendo.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 d.agkn.com js.agkn.com
1 files.giga-video.de www.giga.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 as-sec.casalemedia.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 irqs.ioam.de script.ioam.de
1 www.gstatic.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
0 dmx.districtm.io Failed cdn-a.yieldlove.com
0 orbidder.otto.de Failed cdn-a.yieldlove.com
0 prg.smartadserver.com Failed cdn-a.yieldlove.com
0 adx.adform.net Failed cdn-a.yieldlove.com
254 101
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
*.google.com
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
*.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-10-03 -
2019-12-26
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-10-03 -
2019-12-26
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years 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
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.adtech.de
GeoTrust RSA CA 2018
2019-08-07 -
2021-08-07
2 years 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
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
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
*.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
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
teads.tv
Let's Encrypt Authority X3
2019-08-22 -
2019-11-20
3 months crt.sh
api.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-15 -
2019-11-13
3 months 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
*.twiago.com
Sectigo RSA Organization Validation Secure Server CA
2019-08-12 -
2020-11-09
a year crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2019-04-23 -
2020-02-19
10 months crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years 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
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 37 frames:

Primary Page: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Frame ID: B0F2C5B0E1D47609087D05A8B94B41F8
Requests: 152 HTTP requests in this frame

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

Frame: https://pagead2.googlesyndication.com/pagead/js/r20191003/r20190131/show_ads_impl.js
Frame ID: 1068218F2C98FE46850D6C6E3618B935
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191003/r20190131/zrt_lookup.html
Frame ID: 7C4873F502B6FFCAE29B5BFFC552FEED
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: E682C4D3D1E5D7E0C0C05BB18621F292
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=1570916744&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&flash=0&wgl=1&adsid=NT&dt=1570916744222&bpp=11&bdt=160&fdt=122&idt=122&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&correlator=4262077201997&frm=20&pv=2&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=808059134&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=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4463126061660621&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=1.ealsg1jct2yf&fsb=1&xpc=MybhFG77bj&p=https%3A//www.giga.de&dtd=135
Frame ID: AD0345522347CA4AF6D9F6F0D8CED651
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=1570916744&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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570916744296&bpp=5&bdt=233&fdt=83&idt=83&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=4262077201997&frm=20&pv=1&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=2251803045921790&dssz=59&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&oid=3&pvsid=4463126061660621&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=1.dwq7uzo5j17k&fsb=1&dtd=86
Frame ID: 8FE223B8E548D02A8101B945981F35A2
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: 7E9802CAE8E26943BBF9F1A66E374470
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=557533368&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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: 8307B0DF13CCB3AF92EA2CA7B431956C
Requests: 1 HTTP requests in this frame

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstZ3-6Z-YPXEOrXf2PR5Kay6IIqMgXJoKbNr448n-8El9qeyDxXue5Z8EzPclOdFSGaJkjM1o9-Qp0H4_GduTz83CGl3AycEE9kts3_kND3gqk-h6gfDXfZA1IeMyf2A3krLT50-qD8n3KPP__RVUvYs2he-5BGAAoI9mP9nRxnLfxzi4BN6r58D4qN5-FhA5a5hTyP3mHjQSeV7qjB2YwBe_WVq4W28KmaNqGac3SSB6Q0iP2RLVFsXWwAPFr-xWmSUpaULrwDTW_FoYU&sig=Cg0ArKJSzMytaor1x-6FEAE&urlfix=1&adurl=
Frame ID: 9CDCC4D2AB5DE4B40F5BD129544D7B28
Requests: 14 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvj5wbKUPatb_scYIv2YPYiePG7qQWma1QrJI3Yg0W4dLSz0Myzy-3eAhVuJmUZWL4Tp48yAEBYMKEYattHUImf7yFlHkVzan66Sfu7SN4EKjugGGS6p_8c_0D2kxmLc-tkz9tqzXU2htTKNKL2RAFdF-l6qYV4WrnNPPXXBE7iDiG38snwLyeN41osdEouPfv6daRVoqYcK2sQJdEsxTVCTXm5PK1HNXdMy4Wirkgzloq4Rhufw0wjx3niRjBdq8PU4goqZLCrSA&sig=Cg0ArKJSzMhhDexnpKBnEAE&urlfix=1&adurl=
Frame ID: D1F417233FC2058556487FEA98B8C532
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsup6ri9WauluhtO7a7K1WTzlBXPXstv_jLTjOEYv44YgKDOU44lQkchpbdnUTyFr4tZRCd2bRTguMzH0BrModDWvw6a8C3ypZ1A8jtrF00ytmSFwikwBQgSJDP8_kJpjtZl7bdhV-ojA6UwWnYuLb2AkTD7gPO7wSv0KgQc5U8BqvC1SjKCeMICEFxJR3fHIPtjQuPZpsSS-xBDAjAlGUzZqQ5JEvVgahTVCh74xBlgjIoMjKEl0tyja90EcLwP8qq99RDe1ipObaw&sig=Cg0ArKJSzGV9pJ_CWGtsEAE&urlfix=1&adurl=
Frame ID: 9DE7E2BB129A3D18833DE820A4C04FBD
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuwoqJvq3gn_gbjekZg0HfFr7IXlHZ94jL9W50mgxeFo_ayuoTvWjZbbxeqylqIDANzCTGgJGfib62b6xZvIRyU1FR9wfe5hdrAUi5xQbHrg6jS2_-esk5U8d_ZbH4olif_B7MpBgI7Lk82scZz9Kan7YxAOxGY82PRLVxz9FsyVnD_DIiX9GzAdqv0IVgm0GCIQ02-lqjn2A3aFhBCy_EO50PShdmguC0sje-5L0WJpNiNLKpPxtA8QllmwyvrACnF5qDGGnH9QEE&sig=Cg0ArKJSzDvtKXF6K999EAE&urlfix=1&adurl=
Frame ID: 335A5EB49BFFAEBD35CDA4A2BBEB2804
Requests: 11 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Frame ID: 3CACF32CA200B6844A73C6C35CD544B8
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Frame ID: 4C100AD66D7110A12CB7F68020D32EA3
Requests: 1 HTTP requests in this frame

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

Frame: https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Frame ID: 9DC888538E95F7C482EC4F95A99A8CED
Requests: 1 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3f5726d9-e75c-4178-ba0f-8f282838a9c7
Frame ID: 04BE36AF8D76BB051FCD02F16B5B4C21
Requests: 11 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=E9A38D8CCB3307341871301000876&cicmp=1657475&cijs=1&dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&tst=1&docw=0&cs=false
Frame ID: 2EE4386F2748B43ABAF30AA5241CB64E
Requests: 1 HTTP requests in this frame

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

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

Frame: https://sync.teads.tv/wigo-no-slot
Frame ID: 640C3F859F4DD12E8E1E7008AED76E97
Requests: 1 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=73584&userId=0482aab8-92ec-42b3-99c4-bd46df615f1a&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570916747080
Frame ID: 43AADC6BC6C402EFFB95B56305DB1613
Requests: 1 HTTP requests in this frame

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

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

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

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

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

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: A3B9392D978A4C0B4CF91E232162B8ED
Requests: 1 HTTP requests in this frame

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

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

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: 947035743047FF9FD9FD12E6E3C26FE1
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: FD06F19C9D74FAC3C7EEF566B51FDBE5
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: 745505A67C0E54F10E28BC6E78FFF0E5
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: 28D64B7696BE78158F76D9FCFEE0A8EF
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&docw=0&cijs=1
Frame ID: 5F3B901D1C4110BC47BDEB296746F462
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 /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

254
Requests

96 %
HTTPS

22 %
IPv6

61
Domains

101
Subdomains

75
IPs

7
Countries

3003 kB
Transfer

9272 kB
Size

5
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 14
  • https://ssl-econa.met.vgwort.de/na/f4b19a7f3eb04a8d817de1e0a2485a70 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 20
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FUtrecht&cb=001b&i2=001b2ea7b7bd67ec75da24988&ep=1600965466&vr=415&id=sxnjyl&i3=001b2ea7b7bd67ec75da24988%3A1599342344163%3A1570916744163%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1570916744163&n1=3&dntt=0&lt=1570916744165&ev=&cs=5kqb4z&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=NL%2FUtrecht&cb=001b&i2=001b2ea7b7bd67ec75da24988&ep=1600965466&vr=415&id=sxnjyl&i3=001b2ea7b7bd67ec75da24988%3A1599342344163%3A1570916744163%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1570916744163&n1=3&dntt=0&lt=1570916744165&ev=&cs=5kqb4z&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 31
  • 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 35
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 36
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/9472562e-3bb6-43a8-9c91-0f5ad2a273fa/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F
Request Chain 75
  • 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 104
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss-TZx6d3fP4rzvAHtt4c1DE7mzyjAfintqFgaX6zfyxB2sU0MguEF-rBTOsPXl6JY_0BQK9RWLX7QTn_81zS_l60IAdPJhKezg7gn6Eq3DsGYIhnzPps8gFkokUq3SFLSFOnec3rPC0luuDTcCn59pHKi5YhwAxPUptMH7ojUzPoM_14FfnoCiMw7-OnHmgi2X5edKx4g9BTzU-_sTHgHXUWZ1Ny5VpVO0dP0jQP4rDX27mQTg_GJEGP2YpZ6K9nE2CiHODc5_WSw&sig=Cg0ArKJSzNlbktTsh8RhEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 181
  • 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=3f5726d9-e75c-4178-ba0f-8f282838a9c7
Request Chain 182
  • 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 183
  • 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=dRhnRXI0IQPfsWjrIwW_BOv7JXN-pYSomNBlc9lpAvA%3D
Request Chain 185
  • 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=CAESEFzez345UykwyfCtjhYb6ik&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFzez345UykwyfCtjhYb6ik&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3DCAESEFzez345UykwyfCtjhYb6ik%26google_cver%3D1
Request Chain 187
  • 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=8cf74ec6-13bd-498a-9498-388897df1217 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=8cf74ec6-13bd-498a-9498-388897df1217&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D8cf74ec6-13bd-498a-9498-388897df1217
Request Chain 188
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D2f86422f-4277-4159-ada2-5b96c952e577
Request Chain 191
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://a.twiago.com/rtb/usermatch.php?umid=10&userid=&call_type=redirect&rtbprovider=openrtb&%20gdpr=&gdpr_consent=&redirecturl=https%3A%2F%%202Fx.bidswitch.net%2Fsync%3Fdsp_id%3D397%26user_id%3D%25userid%25%26ssp%3D%20taboola%26bsw_param%3De592ba60-3a61-4660-ae12-4d8197a233f2 HTTP 302
  • https://a.twiago.com/%%202Fx.bidswitch.net/sync?dsp_id=397&user_id=42376881a969c31e98c5699ff8f9ae75c854e000ad1de9933d52252dfd5de&ssp=%20taboola&bsw_param=e592ba60-3a61-4660-ae12-4d8197a233f2
Request Chain 208
  • 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=1570916746846&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=01758982&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?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=1570916746846&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=01758982&cs_ucfr=1
Request Chain 211
  • 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=1570916746861&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=92649997&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?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=1570916746861&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=92649997&cs_ucfr=1
Request Chain 219
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Request Chain 249
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBib-WDR0BsbsWsUkWsfABifABSfABSfABifABifABfrr&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=4206507991164553106

254 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
143 KB
53 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
b7804abd1a4348718be6a4955955f35efd3b0f274935c2c49661ef4c547afc99

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:44 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:43 GMT
last-modified
Fri, 11 Oct 2019 14:16:32 GMT
server
nginx
accept-language
bytes
etag
"5da08ec0-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
Sun, 11 Oct 2020 21:45:43 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:43 GMT
last-modified
Fri, 11 Oct 2019 14:16:32 GMT
server
nginx
accept-language
bytes
etag
"5da08ec0-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
Sun, 11 Oct 2020 21:45:43 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:43 GMT
last-modified
Fri, 11 Oct 2019 14:16:32 GMT
server
nginx
accept-language
bytes
etag
"5da08ec0-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
Sun, 11 Oct 2020 21:45:43 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
9625
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19147-FRA
access-control-allow-origin
*
last-modified
Sat, 12 Oct 2019 19:05:18 GMT
server
Apache
x-timer
S1570916744.131999,VS0,VE0
date
Sat, 12 Oct 2019 21:45:44 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Sun, 13 Oct 2019 19:05:18 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
1573
pre-e5e02f88d8.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-e5e02f88d8.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
40fec556296582552c3898912b32fad93973e972ef0130d4a3b5421cdfda6259

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Fri, 11 Oct 2019 11:15:44 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5da0640d-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19335
expires
Sat, 10 Oct 2020 11:15:44 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:36 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:36 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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 001b
Resource Hash
b952c120285949582588b6bee440fc289ff4f515bf493f4c439ec2db0c3976af

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
Content-Encoding
gzip
Last-Modified
Sat, 12 Oct 2019 21:45:44 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 001b
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
Sat, 12 Oct 2019 23:45:44 GMT
metaTag.min.1adb3164d8c7900545faf5b4b02056fe.js
js.stroeermediabrands.de/
248 KB
60 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.1adb3164d8c7900545faf5b4b02056fe.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
30b069c3c96bfbf561108b6187f21f804fbbbc98752662e3b060d6547c6196fd

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
last-modified
Fri, 11 Oct 2019 11:59: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
Sun, 11 Oct 2020 21:45:44 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
Sun, 13 Oct 2019 21:45:44 GMT
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
1 KB
2 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:40:46 GMT
x-content-type-options
nosniff
age
2012698
filer-source
006b20bf795e02b1f61b38f96553d06c747714f668d1b32549e4adaaaf107b9d
x-cache
HIT
status
200
accept-language
bytes
content-length
1215
x-xss-protection
1; mode=block
last-modified
Thu, 19 Sep 2019 14:40:46 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:40:46 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
103 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
1ac8db4f957de8de07235e60e6380fca8d8f77e8d26a2075c4349c3c6b9564ca
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
36814
x-xss-protection
0
server
cafe
etag
18362386677104716102
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sat, 12 Oct 2019 21:45:44 GMT
1.gif
www.gstatic.com/psa/static/
53 B
174 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Fri, 11 Oct 2019 00:08:37 GMT
x-content-type-options
nosniff
last-modified
Thu, 21 Apr 2016 03:17:22 GMT
server
sffe
age
164227
content-type
image/gif
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
53
x-xss-protection
0
expires
Sat, 10 Oct 2020 00:08:37 GMT
google-passwort-%C3%A4ndern_Artikelbild-giga-rcm200x113.jpg
static.giga.de/wp-content/uploads/2014/04/
3 KB
3 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2014/04/google-passwort-%C3%A4ndern_Artikelbild-giga-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
314132c557a177a63efb52318a95a7cfb91bb9f92a7076c73aec17cfc673ce8d
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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 06:06:15 GMT
x-content-type-options
nosniff
age
661169
filer-source
a0064b63d778bce9f4a6ad7f2e7e2a412f45bfe7c53ef9bc06074b4937172565
x-cache
HIT
status
200
accept-language
bytes
content-length
2580
x-xss-protection
1; mode=block
last-modified
Wed, 25 Sep 2019 17:05:43 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
Fri, 25 Oct 2019 17:05:43 GMT
paypal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2015/04/
7 KB
7 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/04/paypal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
8e7c9e395ea8854ef513bc67def97960993015fc3ec515d23dd812a417a02556
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 10 Oct 2019 06:28:19 GMT
x-content-type-options
nosniff
age
227845
filer-source
97f86f18587daa69d766f5f6dbb086ddcfea58c06afb25109a3d862e2e0427d1
x-cache
HIT
status
200
accept-language
bytes
content-length
6944
x-xss-protection
1; mode=block
last-modified
Thu, 10 Oct 2019 06:28:19 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
Sat, 09 Nov 2019 06:28:19 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/f4b19a7f3eb04a8d817de1e0a2485a70
  • 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
Sat, 12 Oct 2019 21:45:44 GMT
Last-Modified
Sat, 12 Oct 2019 21:45:44 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
250 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8083: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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
Sat, 12 Oct 2019 21:45:44 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-e5e02f88d8.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
6694
date
Sat, 12 Oct 2019 19:54:10 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
Sat, 12 Oct 2019 21:54:10 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-e5e02f88d8.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.190.187 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-190-187.fra2.r.cloudfront.net
Software
Server /
Resource Hash
218509e786cb5203e3d152a936ee6fe6d2887e7fbd9b76562145cd0c0703a25f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 18:39:45 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-C1
etag
41bfc5d281bcb44c0569c3c417818b01
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
accept-ranges
bytes
x-amz-cf-id
aiczwpEmp2xeSCBXshPG0cAjgYjAGl78NzAa61FOzW3K0y-IktBZkA==
via
1.1 8002c303d4f2295f77566a349deba122.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
317eac9d7175a01e3771d4b139f816944438ec16aa5e018649e3d0994f918a12

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
last-modified
Sat, 12 Oct 2019 21:45:44 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
203 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.16380850872635078
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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=NL%2FUtrecht&cb=001b&i2=001b2ea7b7bd67ec75da24988&ep=1600965466&vr=41...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FUtrecht&cb=001b&i2=001b2ea7b7bd67ec75da24988&ep=1600965466&vr=41...
  • 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
Sun, 13 Oct 2019 21:45:44 GMT

Redirect headers

Date
Sat, 12 Oct 2019 21:45:44 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 003b
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
Sat, 12 Oct 2019 21:45:44 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
Fri, 12 Oct 2018 21:45:44 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:44 GMT
last-modified
Fri, 11 Oct 2019 14:16:32 GMT
server
nginx
accept-language
bytes
etag
"5da08ec0-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
Sun, 11 Oct 2020 21:45:44 GMT
2006343101
videos.giga.de/embed/ Frame DBD3
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/2006343101?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
653c559f44c69ec074fc37d07ba335861fd6c9e4d61416e6918f59547748f1cc

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/2006343101?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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=001b2ea7b7bd67ec75da24988:1599342344163:1570916744163:.giga.de:2:giga:software_content:noevent:1570916744163:yccuw1
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.14.1
date
Sat, 12 Oct 2019 21:45:44 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/2006343101>; 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.google-analytics.com
URL: https://www.google-analytics.com/analytics.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
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
Wed, 27 Mar 2019 23:22:31 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
Thu, 26 Mar 2020 23:22:31 GMT
js
www.google-analytics.com/gtm/
93 KB
28 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=476472762.1570916744&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:80b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
805abebb1c272c12cae2d0b4d42456fc034e15f2c454345731db0edc8102c2f6
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
28709
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45: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:819::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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:821::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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/r20191003/r20190131/
232 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191003/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:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6df5a2fc07e8b543b7428df746cf2d2b79fc5e44eaa58a7e193edca54f3acf4e
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
87365
x-xss-protection
0
server
cafe
etag
4488748446277364222
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 12 Oct 2019 21:45:44 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20191003/r20190131/ Frame 1068
232 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191003/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:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6df5a2fc07e8b543b7428df746cf2d2b79fc5e44eaa58a7e193edca54f3acf4e
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
87365
x-xss-protection
0
server
cafe
etag
4488748446277364222
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 12 Oct 2019 21:45:44 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191003/r20190131/ Frame 7C48
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191003/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:81b::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/r20191003/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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

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
Thu, 10 Oct 2019 01:03:25 GMT
expires
Thu, 24 Oct 2019 01:03:25 GMT
content-type
text/html; charset=UTF-8
etag
8648543205226238674
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7402
x-xss-protection
0
cache-control
public, max-age=1209600
age
247339
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.05845143966166799
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
b49ec2c919b994586df5f428d1382493ff8d9b72a34bb54981db36cef825a262
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
X-Content-Type-Options
nosniff
Last-Modified
Sat, 12 Oct 2019 21:45:44 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Sun, 13 Oct 2019 21:45:36 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame E682
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

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
Sat, 12 Oct 2019 21:45:44 GMT
Content-Length
1578
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=2ed5fc200b5d894b3c223bc281540bb7; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Fri, 10 Jan 2020 21:45:44 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
Sat, 12 Oct 2019 21:45:44 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Sat, 12 Oct 2019 22:45:44 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.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
c309bc825095be00ef1122606a0680b454f3388f76d44f4097508394faa230fd
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"305 / 576 of 1000 / last-modified: 1570730339"
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
14506
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
288 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.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.106 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-106.fra50.r.cloudfront.net
Software
/ Express
Resource Hash
0b1b274870c91aa245eab6474f0ed59b9bf4ebf290eeb962f58d118d3f099313

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 20:14:38 GMT
content-encoding
gzip
x-amz-cf-pop
FRA50-C1
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-id
DjDAIlVVlhXRZYOJa8yFvRNLnaOTMyo-CZMulacvc6jdzdz1yTgAmg==
via
1.1 479d15a99f4dd073131fba1516541469.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.1adb3164d8c7900545faf5b4b02056fe.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
Sat, 12 Oct 2019 23:45:44 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
598 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
bc4b9e4ed5dedebf574bc02e6e19f6981b53371efb8f0d6b0a077568b2be1872

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
107

Redirect headers

Date
Sat, 12 Oct 2019 21:45:44 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/9472562e-3bb6-43a8-9c91-0f5ad2a273fa/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F
  • https://nugmw.userreport.com/rc-ap/9472562e-3bb6-43a8-9c91-0f5ad2a273fa/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecial...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/9472562e-3bb6-43a8-9c91-0f5ad2a273fa/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:ae00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
986e83022d081600ae5d4e4154e5bae3808e11ea3596b37637fa8247d76c0daf

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
via
1.1 ec9e3bc729d9c6d55ed32446408ad62f.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
1787
x-amz-cf-id
ViJz3i7g2tjKS0sDtt-DTcWViucZZwxrnBdoTFdmSe_a97kUDkSnOg==

Redirect headers

date
Sat, 12 Oct 2019 21:45:44 GMT
via
1.1 ba5b5e2e7fd98c4a472633bc4c1d4480.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C1
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/9472562e-3bb6-43a8-9c91-0f5ad2a273fa/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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
O-5N0p16XrTc0Q6rd5SMoGod0L8R3RmC9LzUJ1aJXNCf9l9E7MuYOQ==
ad-loading.gif
www.dunkirkinception.com/detect/
148 B
459 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.195.39.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-195-39-206.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
85086fc4f6795d55a36288cf13d4bf2cd50371f6b83fbf465d2641e761563e27

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:44 GMT
X-Powered-By
TSAdServer
ETag
W/"94-BMlv3lL5N8yohWZGZYKS6VYhOxg"
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
148
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.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:400: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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 15:28:00 GMT
via
1.1 cb33a7a4640adbb55df3e0d143601559.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
80142
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
zeIfUK8iEuaBzJJFtAOg3fLChBbJFRBPLXRl5mnIofy5EXvxx1UW8w==
post-24c513bb8a.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-24c513bb8a.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-e5e02f88d8.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
7de21741ce6a04659dae2b7b58e85f029a666b71163d4322a0368886fd69d901

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Fri, 11 Oct 2019 11:15:45 GMT
content-encoding
gzip
x-original-content-length
7039
server
nginx
status
200
etag
W/"5da0640b-1b7f"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2679
expires
Sat, 10 Oct 2020 11:15:45 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-e5e02f88d8.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:44 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:44 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-e5e02f88d8.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:34 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:34 GMT
loader.js
c.nativendo.de/cdn/asset/js/
54 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1173
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
bbbe5addb526c9ee100006ae80da668ced6db0fb9be01d39e6c74b285a48c63c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
via
1.1 google
cf-cache-status
HIT
age
473200
cf-polished
origSize=55140
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
524c43345a858ca4-VIE
expires
Sun, 11 Oct 2020 21:45:44 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=519741500&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=1466743375&gjid=485905878&cid=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&_r=1&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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=2046913216
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
108 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=519741500&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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=140901199
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Wed, 09 Oct 2019 22:35:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
256202
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
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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&pid=6680393692201570916744333&cb=7823799252471570916744335&ws=1600x1200&v=7.37.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%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
13.224.190.187 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-190-187.fra2.r.cloudfront.net
Software
Server /
Resource Hash
d068320411435bdf9a1c20c6f8051f0275ccee85ddb2639f8cb4cfd32b66880d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-C1
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 8002c303d4f2295f77566a349deba122.cloudfront.net (CloudFront)
x-amz-cf-id
rL_T1Y8jsnNBzD3h0rztn5kHyuCFnsJSlVUq3fdsGtqPOd-baF05cQ==
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
13.224.190.187 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-190-187.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 20:14:29 GMT
content-encoding
gzip
vary
Origin
age
5476
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 3bf3e75bcb9a86b3eb343a1d4392a6df.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
3XCCzFPH4bKdafY0lnT_CsnYemmAiI914JWIKQqRYZlB2OmJ2KybqA==
ads
googleads.g.doubleclick.net/pagead/ Frame AD03
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=1570916744&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&flash=0&wgl=1&adsid=NT&dt=1570916744222&bpp=11&bdt=160&fdt=122&idt=122&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&correlator=4262077201997&frm=20&pv=2&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=808059134&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=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4463126061660621&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=1.ealsg1jct2yf&fsb=1&xpc=MybhFG77bj&p=https%3A//www.giga.de&dtd=135
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191003/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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=1570916744&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&flash=0&wgl=1&adsid=NT&dt=1570916744222&bpp=11&bdt=160&fdt=122&idt=122&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&correlator=4262077201997&frm=20&pv=2&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=808059134&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=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4463126061660621&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=1.ealsg1jct2yf&fsb=1&xpc=MybhFG77bj&p=https%3A//www.giga.de&dtd=135
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

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
Sat, 12 Oct 2019 21:45:44 GMT
server
cafe
content-length
21870
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Sat, 12-Oct-2019 22:00:44 GMT; path=/; domain=.doubleclick.net
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
Sat, 12 Oct 2019 21:45:44 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
28 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/r20191003/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
128869a25131fc642133dda16f4e88b723e1623e20234a39d260a1f0267c518f
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29055
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
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-e5e02f88d8.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 27 Mar 2019 23:22:29 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
Thu, 26 Mar 2020 23:22:28 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 8FE2
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1570916744&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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570916744296&bpp=5&bdt=233&fdt=83&idt=83&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=4262077201997&frm=20&pv=1&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=2251803045921790&dssz=59&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&oid=3&pvsid=4463126061660621&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=1.dwq7uzo5j17k&fsb=1&dtd=86
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191003/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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=1570916744&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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570916744296&bpp=5&bdt=233&fdt=83&idt=83&shv=r20191003&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=4262077201997&frm=20&pv=1&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&ga_fc=0&iag=0&icsg=2251803045921790&dssz=59&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&oid=3&pvsid=4463126061660621&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=1.dwq7uzo5j17k&fsb=1&dtd=86
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

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
Sat, 12 Oct 2019 21:45:44 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Sat, 12-Oct-2019 22:00:44 GMT; path=/; domain=.doubleclick.net
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
Sat, 12 Oct 2019 21:45:44 GMT
cache-control
private
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame DBD3
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/2006343101?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/2006343101?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
Sat, 12 Oct 2019 21:45:44 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 DBD3
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/2006343101?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
d1920f97f83cb1f547ef06bcb9b6d79d0058cc9839f085e983e433c12174cc2e
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/2006343101?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
Sat, 12 Oct 2019 21:45:44 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
93890
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 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-e5e02f88d8.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
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-e5e02f88d8.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-W8a8fWVj0d4f9o1fAqlvnA' '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
Sat, 12 Oct 2019 21:45:44 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-24c513bb8a.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
896e5d83ee1b9064b100e896d41174d656e6cd3dcf6bfddbee224d11abe84d49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
115
x-cache
HIT
status
200
content-length
22066
x-amz-id-2
lNhttlP2zKJARPlJJBKJ1DrtSqwW3ijyOZEAYw50P3OegRmO29Y/BJuFEhaRUYH6oV6Gq2osvyc=
x-served-by
cache-fra19129-FRA
last-modified
Wed, 02 Oct 2019 12:05:05 GMT
server
AmazonS3
x-timer
S1570916744.459780,VS0,VE0
date
Sat, 12 Oct 2019 21:45:44 GMT
vary
Accept-Encoding
x-amz-request-id
C2E8F7BD8842F4DD
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
95
x-cache-hits
11
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=519741500&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=per%20Formular%20melden&_u=6GBAAEADQ~&jid=&gjid=&cid=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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_complaint-view&cd41=Content%201&cm75=1&z=1839233096
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Wed, 09 Oct 2019 22:35:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
256202
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=519741500&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=%20dem%20daf%C3%BCr%20vorgesehenen%20Link&_u=6GBAAEADQ~&jid=&gjid=&cid=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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%2Fwebapps%2Fhelpcenter%2Fhelphub%2Fhome%2F%3Faction%3Demailus&cd41=Content%202&cm75=1&z=1538163576
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Wed, 09 Oct 2019 22:35:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
256202
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
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame DBD3
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/2006343101?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/2006343101?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
Sat, 12 Oct 2019 21:45:44 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 DBD3
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/2006343101?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/2006343101?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
Sat, 12 Oct 2019 21:45:44 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
Fri, 10 Jan 2020 21:45:44 GMT
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
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.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
58949
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
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-e5e02f88d8.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 10 Oct 2019 04:52:29 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
233595
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, 09 Oct 2020 04:52:29 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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&__id=1570916744407&__it=-120&__ic=727391&__iq=3e863c04a9617b80931b9977735bd0cc&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
Last-Modified
Sun, 04 Oct 2009 21:45:36 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
Sat, 06 Oct 2012 21:45:36 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-e5e02f88d8.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:19:09 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:19:09 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=1173
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1173
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
via
1.1 google
cf-cache-status
HIT
age
473199
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
524c4334bac78ca4-VIE
expires
Sun, 11 Oct 2020 21:45:44 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-e5e02f88d8.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1b , 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
submit
lb33.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb33.s400.meetrics.net/bb-mx/submit?/RDYZBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFvzEwlFjpFhsFzvBwhF5wFhsFtoEv0FspFulFtrE1uFklFuzFlyF2pFjlFtwElyFt0ElsFlmFvuFtlEyyFlpFjoFluFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSjBBPAAAAAAAAAOAAAAGBAAAAAAZwSjBBBRksFAQtjFUOc9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sat, 12 Oct 2019 21:45:43 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?/RDYZCIAAATkzFARksFAQtjF1qJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sat, 12-Oct-19 21:45:43 GMT
dB3t-PdrLILJw1.gif
www.giga.de/imagey/newsletters/ads/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagey/newsletters/ads/dB3t-PdrLILJw1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
nuggad
ih.adscale.de/
49 B
482 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=1&d4=1&d11=3&d8=2&d9=2&d12=3&d1=1&d3=4
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
Sat, 12 Oct 2019 21:45:44 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.1adb3164d8c7900545faf5b4b02056fe.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
Content-Encoding
gzip
Last-Modified
Mon, 07 Oct 2019 22:00:12 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
Sun, 13 Oct 2019 21:45:44 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=4463126061660621&correlator=3312344473267732&output=ldjh&impl=fif&adsid=NT&vrg=2019100301&guci=2.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&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%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D15%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D2ed5fc200b5d894b3c223bc281540bb7%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-6%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-1%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-0%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1570916744&dt=1570916744549&dlt=1570916744062&idt=473&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dssz=67&icsg=52956963473602&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
432bef8563dce9f21227b55041045751e2817270d720acc579c2aabe68a5b5e3
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
4642
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_rendering_2019100301.js
securepubads.g.doubleclick.net/gpt/
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
24653
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 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_2019100301.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
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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=4463126061660621&correlator=3312344473267732&output=ldjh&impl=fif&adsid=NT&vrg=2019100301&guci=2.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&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%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D15%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D2ed5fc200b5d894b3c223bc281540bb7%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-6%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-1%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-0%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1570916744&dt=1570916744558&dlt=1570916744062&idt=473&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dssz=68&icsg=52956963473602&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
e58627ba6a7c51694a6c1691729fa1e43f90cb10169efbf446308a9b6bccd79e
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
1742
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 7E98
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.216.48 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=A0YOiL9iwkTppre1bv2zyg0|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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Server
Server
Date
Sat, 12 Oct 2019 21:45:44 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=A0YOiL9iwkTppre1bv2zyg0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 21:45:44 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 21:45:44 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Sat, 12 Oct 2019 21:45:44 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=A0YOiL9iwkTppre1bv2zyg0|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 21:45:44 GMT; Path=/; HttpOnly
Vary
User-Agent
bid
c.amazon-adsystem.com/e/dtb/
122 B
504 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&pid=6680393692201570916744333&cb=9550695537391570916744576&ws=1600x1200&v=7.37.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%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
13.224.190.187 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-190-187.fra2.r.cloudfront.net
Software
Server /
Resource Hash
e8206f84ec4286658bd3051a8a2ea6a95ec17d5b685142f703ead0a7d117b977

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-C1
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 8002c303d4f2295f77566a349deba122.cloudfront.net (CloudFront)
x-amz-cf-id
uSZzfqhfDtBQO3bJL0gObMUgLtXm-Ng55klvdUd8tcCSxbN4_LVF1w==
prebid
ib.adnxs.com/ut/v3/
21 B
711 B
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
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
X-Proxy-Origin
109.236.81.142; 109.236.81.142; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.244:80
AN-X-Request-Uuid
9ac48cd0-fd4b-4f18-bbd1-d653a0c59542
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
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
cygnus
as-sec.casalemedia.com/
24 B
900 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%22518db5b170d25c%22%2C%22imp%22%3A%5B%7B%22id%22%3A%22610234d9d63e37%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%2274ad2a484556ce%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%228a319cbf3d01f%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%229290ff58189dc7%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%2210d29678b100078%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%2211f2d7a0129ca1b%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%22120b1b0056b591d%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%2213a54b4cb90f203%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%2214367b91305715b%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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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
740952ffb17cd168010ff300d8256a5db33a7a26bf888167a7d009526db212fb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
44
Expires
Sat, 12 Oct 2019 21:45:44 GMT
arj
yieldlove-d.openx.net/w/1.0/
4 KB
5 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=b6d241ea-d356-4ba9-a89a-14a93d5db156%2Cb0cff4aa-9354-4540-a741-0b815cbd1aeb%2Ced1636cc-d661-4718-963b-a0c89f371783&nocache=1570916744585&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
a3a23fa4d25333336141f62f59238f18f7309fc1fd2603b90e8c7f1b4c3991b4

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
4408
expires
Mon, 26 Jul 1997 05:00:00 GMT
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570916744585;
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
47 B
256 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570916744585;
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.21.32 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
nginx /
Resource Hash
76a2ae22fb29af4e5309d1ff863aa2de23a3b4e536fbbce206d94ba004dddc15

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
server
nginx
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
47
expires
Mon, 15 Jun 1998 00:00:00 GMT
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570916744585;
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
48 B
81 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570916744585;
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.21.32 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
nginx /
Resource Hash
2fc5f9e40074811f5fc7bd34340fc9aeadee4166dba547b7d5daa42fafb79b08

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
server
nginx
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
48
expires
Mon, 15 Jun 1998 00:00:00 GMT
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570916744585;
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
47 B
80 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570916744585;
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.21.32 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
nginx /
Resource Hash
bd9960206d3cb7074c02fdfdb46d64bcbb39f262686d573e6183162f7dc037fe

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
server
nginx
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
47
expires
Mon, 15 Jun 1998 00:00:00 GMT
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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=b6d241ea-d356-4ba9-a89a-14a93d5db156&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8109879753369182
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.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
69df5bdf7b488a77d32e21bb84221914831e0d22c03c835e6b78347336652935

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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=132
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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=b0cff4aa-9354-4540-a741-0b815cbd1aeb&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.22217597592436644
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.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
147adb52f82298920419532ac2940735722e4ec5b91fa7f1d35d807c89528b53

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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=406
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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=ed1636cc-d661-4718-963b-a0c89f371783&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.678469938597354
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.141 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
c4c75a02887e62fe3f0d1147473736552b456be87ba770c10a0b876a5574f356

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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=95
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
710 B
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
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
X-Proxy-Origin
109.236.81.142; 109.236.81.142; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.45:80
AN-X-Request-Uuid
181ccc2c-876c-415c-8e0d-701b73559ac6
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
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
adx.adform.net/adx/
0
0

v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

v1
dmx.districtm.io/b/
0
0

config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
47 KB
12 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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
a35c9bf832062f67296398e68c7636b67ddb3b1b1912b68373c56e0f4054bfcb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
Content-Encoding
gzip
Age
928
X-Cache
HIT
Connection
keep-alive
Content-Length
11486
x-amz-id-2
Gmiub85R71lMOUApQhiF4RrFwwPg7+K7zwH4YtmNVw9aqX8gv+URRyDb3oV7Klkqum0G90ivOK8=
X-Served-By
cache-hhn4064-HHN
Last-Modified
Sat, 12 Oct 2019 20:26:48 GMT
Server
AmazonS3
X-Timer
S1570916745.662362,VS0,VE0
ETag
"2b8a2499376fde705ccd2d15584673ae"
x-amz-request-id
379F8C887E4A2C70
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
1022
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
30
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
113914
x-amz-id-2
i8xSEXl3lQK2NjFG/Brn+z0xma8NjL8FplV4Af6bErUYSt2J0fxHQWqzwNN6i1RtifadwaJLw/I=
x-served-by
cache-fra19129-FRA
last-modified
Wed, 02 Oct 2019 22:32:20 GMT
server
AmazonS3
x-timer
S1570916745.611899,VS0,VE0
date
Sat, 12 Oct 2019 21:45:44 GMT
vary
Accept-Encoding
x-amz-request-id
53D89C2CE8799238
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
82
x-cache-hits
79
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
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 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
Sun, 13 Oct 2019 21:45:46 GMT
2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
files.giga-video.de/da/5c/dc/ Frame DBD3
15 KB
15 KB
Image
General
Full URL
https://files.giga-video.de/da/5c/dc/2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
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/2006343101?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
Wed, 25 Sep 2019 04:58:13 GMT
x-content-type-options
nosniff
age
1529252
filer-source
5d49872525e25fa08a218d05803618e85dbbffacfec14597f6cf6333e144ba71
x-cache
HIT
status
200
accept-language
bytes
content-length
15022
x-xss-protection
1; mode=block
last-modified
Wed, 25 Sep 2019 04:58:13 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
Fri, 25 Oct 2019 04:58:13 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame 8307
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=557533368&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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
52.28.238.200 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-238-200.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Sat, 12 Oct 2019 21:45:51 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%3AqsUrO6NLlSbZ3FAxaFUuRpwSwfomHp7G;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlNQYQJTUGEAAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
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=519741500&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=2006343101%20--%20Das%20solltest%20du%20%C3%BCber%20PayPal%20wissen%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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=20160501&cd11=2006343101&cd12=SELF&cd13=70&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=56649373
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Wed, 09 Oct 2019 22:35:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
256202
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
94f0875a-5de7-4e17-8df1-e6c6ba69bab3
https://videos.giga.de/ Frame DBD3
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/94f0875a-5de7-4e17-8df1-e6c6ba69bab3
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 DBD3
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.84 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/2006343101?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
Sat, 12 Oct 2019 21:45:45 GMT
Last-Modified
Sat, 12 Oct 2019 16:03:21 GMT
Server
AmazonS3
x-amz-request-id
600D0F830CCFE238
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
IUtMhdIiwbpK52pOX73VoiTNXe45jd+sShSTYtjWMdai4z09qz+l7JqgQQgqkY8tz2tfjhrk+cM=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame DBD3
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/2006343101?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
Sat, 12 Oct 2019 21:45:44 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
Sat, 12 Oct 2019 22:00:44 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame C9BF
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss-TZx6d3fP4rzvAHtt4c1DE7mzyjAfintqFgaX6zfyxB2sU0MguEF-rBTOsPXl6JY_0BQK9RWLX7QTn_81zS_l60IAdPJhKezg7gn6Eq3DsGYIhnzPps8gFkokUq3SFLSFOnec3rPC0...
  • 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:280::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=312013
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Wed, 16 Oct 2019 12:25:57 GMT

Redirect headers

timing-allow-origin
*
date
Sat, 12 Oct 2019 21:45:44 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
/
d.nativendo.de/cds/delivery/get/
5 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1173
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
45bd046c3bc2d6447cf86dc59b5837ce0026b4c3ec8acf8b4f801bc74a3ddf32

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
last-modified
Sat, 12 Oct 2019 21:45:44 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
1123
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 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=23%3A45%3A44.709&lti=deflated&data=%7B%22id%22%3A92%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1570916744703%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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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%3A4085%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%3A2574.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.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
483b1cb9374fb978ee7ecdc91c24b79a7a19f92e862859d3edfa8d9185eff9ce

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 GMT
content-encoding
gzip
server
nginx
x-timer
S1570916746.941733,VS0,VE173
status
200
x-served-by
cache-hhn4039-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
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4463126061660621&correlator=3312344473267732&output=ldjh&impl=fif&adsid=NT&vrg=2019100301&guci=2.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%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%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D15%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D2ed5fc200b5d894b3c223bc281540bb7%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-6%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-1%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-0%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie=ID%3D9d7666be5ac8661e%3AT%3D1570916744%3AS%3DALNI_Mb7VUJxpBg-hd-i4QbG6DgrGGjHfA&cookie_enabled=1&bc=31&abxe=1&lmt=1570916744&dt=1570916744718&dlt=1570916744062&idt=473&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&uci=3&ifi=4&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dssz=73&icsg=847311415577608&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwGds0pKjdVU&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
70798af7cba7b5d19bb39d288ad489e45cc967669f09880404a1264bad478629
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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
3129
x-xss-protection
0
google-lineitem-id
4766719661
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138260902192
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/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4463126061660621&correlator=3312344473267732&output=ldjh&impl=fif&adsid=NT&vrg=2019100301&guci=2.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&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_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D15%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D2ed5fc200b5d894b3c223bc281540bb7%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-6%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-1%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-0%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie=ID%3D9d7666be5ac8661e%3AT%3D1570916744%3AS%3DALNI_Mb7VUJxpBg-hd-i4QbG6DgrGGjHfA&cookie_enabled=1&bc=31&abxe=1&lmt=1570916744&dt=1570916744722&dlt=1570916744062&idt=473&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2089391793&uci=4&ifi=5&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dssz=73&icsg=847311415577608&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwGds0pKjdVU&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
0a2a14c9cdb999da22b06a0e6001164a64701acb46d9fad27624ada79fd7824a
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
3124
x-xss-protection
0
google-lineitem-id
4765983595
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138260901733
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/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4463126061660621&correlator=3312344473267732&output=ldjh&impl=fif&adsid=NT&vrg=2019100301&guci=2.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D15%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D2ed5fc200b5d894b3c223bc281540bb7%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-6%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-1%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-0%252Cn84-0%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie=ID%3D9d7666be5ac8661e%3AT%3D1570916744%3AS%3DALNI_Mb7VUJxpBg-hd-i4QbG6DgrGGjHfA&cookie_enabled=1&bc=31&abxe=1&lmt=1570916744&dt=1570916744727&dlt=1570916744062&idt=473&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&uci=5&ifi=6&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dssz=73&icsg=847311415577608&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwGds0pKjdVU&ga_vid=476472762.1570916744&ga_sid=1570916744&ga_hid=519741500&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
67e5ce59ad3f3bbc0b7c49bccdc80be5877e9eb7aa4544cdf1070218ce48cf26
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
3185
x-xss-protection
0
google-lineitem-id
4766719655
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138241245897
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
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&n116=0&n104=1&n15=2&n155=1&n135=6&n106=0&n153=0&n11=1&n120=6&n154=1&n125=1&n8=1&n137=0&n101=0&n108=1&n54=0&n110=1&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=0&n107=0&n117=4&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=3&n57=1&n77=0&n83=0&n102=0&n105=1&n159=1&n20=1&n80=1&n12=1&n141=0&n157=0&n99=1&n128=1&n118=1&n85=0&n9=3&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=0&n93=3&n90=1&n55=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=0&n91=0&n46=1&n114=0&n69=0&n47=1&n10=3&n3=1&n82=0&n84=0&n5=4&n48=1&n109=0&n122=1&n67=0&n115=1&n89=1&n123=1&n17=1&n78=0&n81=1&n88=1&n39=1&n156=1&n148=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 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 DBD3
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.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:44:59 GMT
Via
1.1 06d36e78e8dfd9468327f09115761a9e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
48
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-C2
Accept-Ranges
bytes
X-Amz-Cf-Id
_f5KMcCqmgeOCbXFu0liQAGyUS2PDYNHc0uKCyZtiSy2A94LVqFitw==
Expires
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910081641/
28 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910081641/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ea95f0af562ea3e973bfa8a4e982cbde7419632c3fb74c9d2eed6a307d266518

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
Content-Encoding
gzip
Age
468
X-Cache
HIT
Connection
keep-alive
Content-Length
10600
x-amz-id-2
Si4XvJBf3Yg7h9nfkK7UHMglKOKE5co46RRDDUc7szH6DDr++5a1dXd7yMBpEZYnAb72yHdNbNE=
X-Served-By
cache-hhn4064-HHN
Last-Modified
Wed, 09 Oct 2019 18:23:30 GMT
Server
AmazonS3
X-Timer
S1570916745.770933,VS0,VE0
ETag
"589c7eabd142fb9075b2506bd7476e61"
x-amz-request-id
8564C6A12D976C5C
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
604
view
securepubads.g.doubleclick.net/pcs/ Frame 9CDC
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstZ3-6Z-YPXEOrXf2PR5Kay6IIqMgXJoKbNr448n-8El9qeyDxXue5Z8EzPclOdFSGaJkjM1o9-Qp0H4_GduTz83CGl3AycEE9kts3_kND3gqk-h6gfDXfZA1IeMyf2A3krLT50-qD8n3KPP__RVUvYs2he-5BGAAoI9mP9nRxnLfxzi4BN6r58D4qN5-FhA5a5hTyP3mHjQSeV7qjB2YwBe_WVq4W28KmaNqGac3SSB6Q0iP2RLVFsXWwAPFr-xWmSUpaULrwDTW_FoYU&sig=Cg0ArKJSzMytaor1x-6FEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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 9CDC
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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 9CDC
77 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_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b9ff1458bf3b7fc93c0312feca098dc18a387d52f9ee4b59fd426eee59789809
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29542
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
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=1173
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
4fe7907b1a352b40ea8de18285ccee7436334b363de8869fff9d331c3c36ad6a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame DBD3
206 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=ANzgAbAcFC
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.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a3de5528c777975b4e0521ca4cacbebfe101eb4abc50b41e11d147f1f9c7e560

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:45:00 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
45
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Tue, 08 Oct 2019 09:58:12 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 06d36e78e8dfd9468327f09115761a9e.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA2-C2
X-Amz-Cf-Id
wxLjfb2G6P5lc2A_E38XlJtgCpNzPTWpiNbTIi8U6RDHH4t3K_xziw==
truncated
/ Frame DBD3
206 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a3de5528c777975b4e0521ca4cacbebfe101eb4abc50b41e11d147f1f9c7e560

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
view
securepubads.g.doubleclick.net/pcs/ Frame D1F4
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvj5wbKUPatb_scYIv2YPYiePG7qQWma1QrJI3Yg0W4dLSz0Myzy-3eAhVuJmUZWL4Tp48yAEBYMKEYattHUImf7yFlHkVzan66Sfu7SN4EKjugGGS6p_8c_0D2kxmLc-tkz9tqzXU2htTKNKL2RAFdF-l6qYV4WrnNPPXXBE7iDiG38snwLyeN41osdEouPfv6daRVoqYcK2sQJdEsxTVCTXm5PK1HNXdMy4Wirkgzloq4Rhufw0wjx3niRjBdq8PU4goqZLCrSA&sig=Cg0ArKJSzMhhDexnpKBnEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:44 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
gpt.js
www.googletagservices.com/tag/js/ Frame D1F4
44 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ef95ce2969cec0d47b6ace1c44eeea2a69a1da135aba966c3e83621b5cf15c8c
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"305 / 500 of 1000 / last-modified: 1570730339"
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="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
14512
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame D1F4
77 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_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b9ff1458bf3b7fc93c0312feca098dc18a387d52f9ee4b59fd426eee59789809
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29542
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:44 GMT
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame D1F4
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
58949
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame D1F4
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame D1F4
21 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=885185564640454&correlator=1932501447753345&output=ldjh&impl=fif&eid=21062888&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-728x90&sz=728x90&eri=6&cookie=ID%3D613dec43d61b0a8a%3AT%3D1570916744%3AS%3DALNI_MbirXobMJOOC8zN1CKBKsoKogBhuw&cdm=www.giga.de&bc=31&abxe=1&lmt=1570916745&dt=1570916745135&dlt=1570916744962&idt=168&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adx=429&ady=121&adk=4143599050&uci=omaqly850nva&ifi=1&ifk=91634144&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=476472762.1570916744&ga_sid=1570916745&ga_hid=1640649808&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
6b09ffd0535f755f0c617c421d81bb9d9b044b2a0936874c72e5bd7a1c486f05
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
7915
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369431
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_rendering_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame D1F4
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
24653
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame D1F4
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.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
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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

view
securepubads.g.doubleclick.net/pcs/ Frame 9DE7
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsup6ri9WauluhtO7a7K1WTzlBXPXstv_jLTjOEYv44YgKDOU44lQkchpbdnUTyFr4tZRCd2bRTguMzH0BrModDWvw6a8C3ypZ1A8jtrF00ytmSFwikwBQgSJDP8_kJpjtZl7bdhV-ojA6UwWnYuLb2AkTD7gPO7wSv0KgQc5U8BqvC1SjKCeMICEFxJR3fHIPtjQuPZpsSS-xBDAjAlGUzZqQ5JEvVgahTVCh74xBlgjIoMjKEl0tyja90EcLwP8qq99RDe1ipObaw&sig=Cg0ArKJSzGV9pJ_CWGtsEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
gpt.js
www.googletagservices.com/tag/js/ Frame 9DE7
44 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ef95ce2969cec0d47b6ace1c44eeea2a69a1da135aba966c3e83621b5cf15c8c
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"305 / 128 of 1000 / last-modified: 1570730339"
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="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
14512
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 9DE7
77 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_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b9ff1458bf3b7fc93c0312feca098dc18a387d52f9ee4b59fd426eee59789809
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29542
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
truncated
/ Frame D1F4
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c7cf83b63518d1a4a3ac0f33d021b1e4fba1283ff559719e1c49844d17aebaf5

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
le.php
media.oadts.com/www/delivery/ Frame 9CDC
43 B
423 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=45521824640
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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 9CDC
43 B
423 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=35581524815
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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 9CDC
43 B
423 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=9539833290
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
avc.php
media.oadts.com/www/delivery/ Frame 9CDC
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=atg5497627748&startmuted=1&cb=0.5132119358082226&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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
e992c8fd6b6e3f14e0b78ee949c8959604d84319d7baa589f33aa9f6fb353992

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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 9CDC
43 B
423 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=63512006103
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 9DE7
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
58949
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 9DE7
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
108
x-xss-protection
0
a0aa592d-3ce6-4625-ad5e-55b804a081f9
t.nativendo.de/cds/tracking/event/
0
195 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a0aa592d-3ce6-4625-ad5e-55b804a081f9?aid=182yo&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ts=1570916745
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1173
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 GMT
via
1.1 google
last-modified
Sat, 12 Oct 2019 21:45:45 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 9CDC
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=864e9c14f1&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
6ba5586970a86597ecd6b18e44de96147f414bbdaccb111f56c59d6ae1d3bc6f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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 9CDC
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.5991362000750962&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
ads
securepubads.g.doubleclick.net/gampad/ Frame 9DE7
21 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=236390373633689&correlator=3336790049007761&output=ldjh&impl=fif&eid=21064578%2C21064387%2C21064580&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x600&sz=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3D613dec43d61b0a8a%3AT%3D1570916744%3AS%3DALNI_MbirXobMJOOC8zN1CKBKsoKogBhuw&cdm=www.giga.de&bc=31&abxe=1&lmt=1570916745&dt=1570916745273&dlt=1570916745140&idt=124&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adx=1318&ady=121&adk=2714360146&uci=78p3c82fom5e&ifi=1&ifk=1635171202&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=476472762.1570916744&ga_sid=1570916745&ga_hid=933527579&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
c4952a581943acd781bb4f77eb38864175717296578a3c3cf7e863400f784e0e
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
7940
x-xss-protection
0
google-lineitem-id
5021208867
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266089767
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_rendering_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 9DE7
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js?21064578
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
24653
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 9DE7
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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

global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame DBD3
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=2126074247
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.74.84 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/2006343101?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
Sat, 12 Oct 2019 21:45:46 GMT
Last-Modified
Sat, 12 Oct 2019 16:03:21 GMT
Server
AmazonS3
x-amz-request-id
261F2481AB29FB94
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
wzYZxH1rRVmxJffCuFsW74yrlCUXKvRg+3ceHgfP2BerJ3RoqZxd4Zt2MopYCXxZwzsI/JNUJkQ=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame DBD3
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=7605870800
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
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/2006343101?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
Sat, 12 Oct 2019 21:45:45 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
Sat, 12 Oct 2019 22:00:45 GMT
truncated
/ Frame 9DE7
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fccbb630a1abe89586932db6cc687b1f4a6daee0fa7cf8e9b118f0f97e582629

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
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame DBD3
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=2387548923
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:44:59 GMT
Via
1.1 06d36e78e8dfd9468327f09115761a9e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
49
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-C2
Accept-Ranges
bytes
X-Amz-Cf-Id
Ewf1B_bxfoBgEFA-uJzlh9vo-xGWViYWkQscTUPx97bVxXN8O1BqJw==
Expires
0
view
securepubads.g.doubleclick.net/pcs/ Frame 335A
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuwoqJvq3gn_gbjekZg0HfFr7IXlHZ94jL9W50mgxeFo_ayuoTvWjZbbxeqylqIDANzCTGgJGfib62b6xZvIRyU1FR9wfe5hdrAUi5xQbHrg6jS2_-esk5U8d_ZbH4olif_B7MpBgI7Lk82scZz9Kan7YxAOxGY82PRLVxz9FsyVnD_DIiX9GzAdqv0IVgm0GCIQ02-lqjn2A3aFhBCy_EO50PShdmguC0sje-5L0WJpNiNLKpPxtA8QllmwyvrACnF5qDGGnH9QEE&sig=Cg0ArKJSzDvtKXF6K999EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
gpt.js
www.googletagservices.com/tag/js/ Frame 335A
44 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ef95ce2969cec0d47b6ace1c44eeea2a69a1da135aba966c3e83621b5cf15c8c
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"305 / 742 of 1000 / last-modified: 1570730339"
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="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
14512
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 335A
77 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_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b9ff1458bf3b7fc93c0312feca098dc18a387d52f9ee4b59fd426eee59789809
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29542
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
/
ssl.3.damoh.giga.de/a769f9f6605a3a33fa21981a54c87713cd09e861/ Frame DBD3
653 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.giga.de/a769f9f6605a3a33fa21981a54c87713cd09e861/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.244.75 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.75.244.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:45:45 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
de36-homad-5
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
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?/RDYZDWOAAKktFLkqFFlqwF23A52AwwA/k0FFEmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAyxA5yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA5xA23A01AywA3BELlnFB/k0FEImvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAyxA5yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA5xA23A01AywA3mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx3AzzAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Aw5Ax2A30A1zA33ALlnFCUkzFYBPsLAAAAAAABQhzAPBAAFAAQhzTYeNAPAAAtGA5BABYeNAZBAAOA55A55A85B55A58E55A55AGAyxAxwAy0ArYeNASksFMFjAAAAAAAAAAAAEAAAQhzAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA2wA5wAyxA5yAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A22A3xA52A2xAGAihFuuFlyFKA03A22A3xA52A2xAKA03A22A3xA52A2xAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA5BAYLAaBAFAAAYeNAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFp9c2YA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sat, 12-Oct-19 21:45:44 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 3CAC
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.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
/safeframe/1-0-35/html/container.html?n=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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Sat, 12 Oct 2019 19:54:51 GMT
expires
Sun, 11 Oct 2020 19:54:51 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
6654
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame D1F4
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
128869a25131fc642133dda16f4e88b723e1623e20234a39d260a1f0267c518f
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29055
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 335A
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
58949
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 335A
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
108
x-xss-protection
0
vast
tracking.m6r.eu/sync/ Frame 9CDC
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%3D864e9c14f1%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Fspecials%252Fpaypal-hotline-kundenservice-per-telefon-erreichen%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D72622eaf-afa4-47e7-be27-bf8c1c47f438
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
dcdc865207319f39f803b7d1694b6f5fbfe1cabd3db8b49d62a2fb5d54cc95b4

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 4C10
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js?21064578
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
/safeframe/1-0-35/html/container.html?n=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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Sat, 12 Oct 2019 19:54:51 GMT
expires
Sun, 11 Oct 2020 19:54:51 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
6654
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 9DE7
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
128869a25131fc642133dda16f4e88b723e1623e20234a39d260a1f0267c518f
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29055
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
getAd
video-adserver.ibillboard.com/ Frame 9CDC
48 B
590 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=864e9c14f1&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=72622eaf-afa4-47e7-be27-bf8c1c47f438
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 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
ads
securepubads.g.doubleclick.net/gampad/ Frame 335A
21 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2237792877526379&correlator=3512687777363095&output=ldjh&impl=fif&eid=21064211&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191012&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x250&sz=300x250&eri=6&cookie=ID%3D613dec43d61b0a8a%3AT%3D1570916744%3AS%3DALNI_MbirXobMJOOC8zN1CKBKsoKogBhuw&cdm=www.giga.de&bc=31&abxe=1&lmt=1570916745&dt=1570916745474&dlt=1570916745339&idt=131&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3816689529&uci=rsn7ecjcyhhh&ifi=1&ifk=1057130504&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=476472762.1570916744&ga_sid=1570916745&ga_hid=1530499186&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
25e733a1f613ecc38ec1328b523886d15b54ebb05755db0a653cef4bd00745e6
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 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
7933
x-xss-protection
0
google-lineitem-id
5021208867
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266090223
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_rendering_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 335A
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 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
24653
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 335A
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.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
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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

truncated
/ Frame 335A
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
afdd14fdfb324274dcb74a70f26c940d7292a9f3d208a95fb462097bb22177d5

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
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?/RDYZE8QAA/k0FUMmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAyxA5yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA5xA23A01AywA3mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx3AzzAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Aw5Ax2A30A1zA33AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A21A1mAjpFk9BxzA4yA0xAy0A14A53AmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF90A32A23Ax5A21A1mAhwFk9B03A22A3xA52A11AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Aw5Ax2A30A11A0yAUkzF2BPnCAAAAAAABRq6APBAAFAARq6Tl5/APAAAmUA5BABl5/AZAAAOA55A55A85B55A58E55A55AGAy0AwyA3zArl5/APPAAtGA5BAHYeNAPAAAmUA5BAHl5/ASksFGFjAAAAAAAAAAAAEAAARq6AAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA2wA5wAx3AzzAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A21A54Az1A51ADAzrF5BFKA03A21A54Az1A51AKA03A21A54Az1A51AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAsEAYJAFAAAl5/AAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFlLIwYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sat, 12-Oct-19 21:45:44 GMT
hic_qos
ssl.1.damoh.giga.de/ Frame DBD3
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,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.247 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.247.115.76.144.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/2006343101?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
Sat, 12 Oct 2019 21:45:45 GMT
Last-Modified
Wed, 24 Jul 2019 10:17:21 GMT
Server
openresty/1.15.8.2
ETag
"5d383031-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 E6FE
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4da0d48ee11ac72c8809a7968e119f79330ed6a86acd7393c2e8d1a061fb0dba

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
w0M
tracker-adserver.ibillboard.com/error/impid/72622eaf-afa4-47e7-be27-bf8c1c47f438/iid/e6706767-1fd1-4273-9c03-084954efa324/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 9CDC
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/72622eaf-afa4-47e7-be27-bf8c1c47f438/iid/e6706767-1fd1-4273-9c03-084954efa324/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/w0M?erc=303
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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 9CDC
1 KB
826 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 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
Sat, 12 Oct 2019 22:45:46 GMT
/
ssl.3.damoh.giga.de/cc3392a28f3424e632f15af6c77f76a328bc778a/ Frame DBD3
109 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/cc3392a28f3424e632f15af6c77f76a328bc778a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.244.75 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.75.244.243.136.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:45:46 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.3.damoh.giga.de/cd3d02a61f33b3a67611a05ff790791c55aed881/ Frame DBD3
42 B
738 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/cd3d02a61f33b3a67611a05ff790791c55aed881/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFVuYWh2YW11cXVhaHRvb1Y9VW5haHZhbXVxdWFodG9vVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5VbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5OdShtKTthLk11KGwpO2Eud3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5WdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzRdO3RoaXMuWnI9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5taz1iO2IucHJvdG90eXBlPXtZcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnA6dGhpcy5ZcihhKX0sWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5ta3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWXAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW89CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuUmc9e307dGhpcy5kZj0hMX1jLlZqPWI7Yi5wcm90b3R5cGU9e3Z2OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmRmfHwodGhpcy5kZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZGZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5SZ1thXSYmKHRoaXMuUmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy52digpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxSbjpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sVXQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuVHQoYS5kYXRhKX0sVHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sZ2U6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sb2c6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuamgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEdnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxQbjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuenEoYSkpcmV0dXJuOyhiPXRoaXMub2coYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0sd2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHhlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxGZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0semU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxLaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LFNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxnajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxKbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxLbzpmdW5jdGlvbigpe3JldHVybiBhLllpKCl8fGEuZ2ooKXx8YS5tcigpfHxhLkpsKCl8fGEuY24oKXx8YS5ibCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5LbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFpiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFhxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxtdjpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxCZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuY2koYikrIjoiK3RoaXMuY2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxmZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHlnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5jZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEJjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy55ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkJjKEIpfSxXdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLlhxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sbnY6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5jZShhKX0sY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5XdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uSmMoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLkpjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uSmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTGU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uZ3AoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGUoKX0uYmluZCh0aGlzKSw1MDApfSx2ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGNnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5HZShhKXx8dGhpcy5XcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmNmJiZ3aW5kb3cuc2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLndnKGEpKXJldHVybiB0aGlzLndnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5QbihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0samg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHJzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmpoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk5jKWZvcih2YXIgYyBpbiB0aGlzLk5jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ycyhmLnFkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTmM9YX0sang6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LExvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxRcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5Wanx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuVWo9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5KdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Lcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmZxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZ3g9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Hbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnV3PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc3A9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmRkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Jbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi4kZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5iZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuSG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmppPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuT3M9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi50ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLmxnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xdz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iucnc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuTHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlVqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxsPXRoaXMuYVsxMF07dGhpcy5Faz10aGlzLmFbNl07dGhpcy5ubz10aGlzLmFbMV07dGhpcy5Ocz10aGlzLmFbNl07dGhpcy5odz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs1XX1jLmV0PWI7Yi5wcm90b3R5cGU9e0tsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5MbDp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWs6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5vOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLmd3KGEpfSxndzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaHc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLmV0fHwKamEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuS2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Xaj1iO2IucHJvdG90eXBlPXt6ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKwoiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy56ZSh0aGlzLlNxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuV2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueG89dGhpcy5hWzhdO3RoaXMucXE9dGhpcy5hWzEwXTt0aGlzLmd0PXRoaXMuYVs0XTt0aGlzLk1pPXRoaXMuYVsxMF07dGhpcy5peD10aGlzLmFbN107dGhpcy5lbz10aGlzLmFbNV07CnRoaXMuWXQ9dGhpcy5hWzFdO3RoaXMuWWw9dGhpcy5hWzVdO3RoaXMubHY9dGhpcy5hWzJdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzddfWMueHQ9YjtiLnByb3RvdHlwZT17d286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhvOnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXE6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd0OnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NaTp0aGlzLmh4KGEpfSxoeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXg6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVvOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZdDp0aGlzLlhsKGEpfSxYbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLllsOnRoaXMua3YoYSl9LGt2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMubHY6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy54dHx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2Mud28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPQp0aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJxPXRoaXMuYVs1XTt0aGlzLnBtPXRoaXMuYVs0XTt0aGlzLmZzPXRoaXMuYVs4XTt0aGlzLkZ0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMuZXU9YjtiLnByb3RvdHlwZT17QXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJxOnRoaXMub20oYSl9LApvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZzOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5GdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLmV1fHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5BcSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLmptPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLk91KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sQnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LE91OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS51dihiKX0sVng6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9LFJyOmZ1bmN0aW9uKGIpe2I9CmIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG15OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuam18fHQ7KGZ1bmN0aW9uKGMpe2MubG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTsKcmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxZdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sV3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxSdTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LFV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LG95OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmlyKCl8fHRoaXMuS24oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sS246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxUeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sWng6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGp5OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxReDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5sbXx8cDsoZnVuY3Rpb24oYyl7Yy52aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy5Dbj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLlB1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sR3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMuR3IoKTtpZighdGhpcy5PcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sV3U6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxHeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sdXM6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy52aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GcD10aGlzLmFbMl07dGhpcy5Naz10aGlzLmFbNF07dGhpcy5ucz10aGlzLmFbNl07dGhpcy5ocz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLmVxPWI7Yi5wcm90b3R5cGU9e0VwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GcDp0aGlzLkxrKGEpfSxMazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1rOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5uczp0aGlzLmdzKGEpfSxnczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmVxfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuRXAoNCk7KGZ1bmN0aW9uKGMpe2MuQ2o9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Danx8b2E7KGZ1bmN0aW9uKGMpe2MuRGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5IeDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLAp0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLkRqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Fanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5seD10aGlzLmFbMl07dGhpcy5nbj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLmZ1PWI7Yi5wcm90b3R5cGU9e2t4OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5seDp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmZ1fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5reCg0KTsoZnVuY3Rpb24oYyl7Yy54az1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5ycD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy54a3x8c2E7KGZ1bmN0aW9uKGMpe2Mud2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnJwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sdXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy53a3x8dGE7KGZ1bmN0aW9uKGMpe2MueWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlJyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sU3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5xOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy55a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnluPXRoaXMuYVs1XTt0aGlzLiR3PXRoaXMuYVs3XTt0aGlzLlBrPXRoaXMuYVs2XTt0aGlzLlNpPXRoaXMuYVs5XTt0aGlzLkhzPXRoaXMuYVs0XTt0aGlzLmFxPXRoaXMuYVsxMF07dGhpcy5Laz10aGlzLmFbMTBdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5hcz1iO2IucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueW46dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLiR3OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLlJpKGEpfSwKUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Iczp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5KayhhKX0sSms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktrOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuYXN8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnhuKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9CmIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmCiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTsKdmFyIHhhPWMuWW18fHhhOyhmdW5jdGlvbihjKXtjLlhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLklzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuYnAoKSx0aGlzLnJiKCkpfSxJczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxreTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsCiI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/CmIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LApYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxQcjpmdW5jdGlvbigpe2lmKCF0aGlzLlVnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLk5yKCk7d2luZG93LmltYSYmYiYmCihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMudHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLAohMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sdHU6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxSeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LGJwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTsKdGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuUHIoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuVmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToKKHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGNwOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuemM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3AoKX0uYmluZCh0aGlzKSwKMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5laSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLiR4fHwoMTA8dGhpcy5Edz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5EdysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLkF1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtwKCl9LmJpbmQodGhpcyksNTApKSl9LEF1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkV3KXt0aGlzLkV3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLAoidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuWG18fHlhOyhmdW5jdGlvbihjKXtjLlptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7CnZhciB6YT1jLlptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3M9dGhpcy5hWzEwXTt0aGlzLm9sPXRoaXMuYVsyXTt0aGlzLlNwPXRoaXMuYVs1XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLmt3PXRoaXMuYVs2XTt0aGlzLmh2PXRoaXMuYVs5XTt0aGlzLkJ0PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzEwXX1jLlBvPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Dczp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNwOnRoaXMuVmwoYSl9LFZsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5XbDp0aGlzLml3KGEpfSxpdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3c6dGhpcy5ndihhKX0sCmd2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5odjp0aGlzLkF0KGEpfSxBdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLlBvfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Ccyg0KTsoZnVuY3Rpb24oYyl7Yy5QbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpOwpyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxNdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuUGx8fENhOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5scT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubHE9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuT2x8fERhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPWMuUWx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55aj10aGlzLmFbNV07dGhpcy56bz10aGlzLmFbMV07dGhpcy5kbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLmJ0PWI7Yi5wcm90b3R5cGU9e3hqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55ajp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuem86dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5kbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnR8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLnhqKDQpOyhmdW5jdGlvbihjKXtjLnVrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuU3Q9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5TdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxqcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuanAoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy51a3x8SGE7KGZ1bmN0aW9uKGMpe2MudGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudGt8fElhOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBKYT1jLnZrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWo9dGhpcy5hWzZdO3RoaXMud3A9dGhpcy5hWzFdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuVWw9dGhpcy5hWzldO3RoaXMuUm09dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNl19Yy5Wdj1iO2IucHJvdG90eXBlPXt0ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndwOnRoaXMuVW0oYSl9LFVtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm06dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVsOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlZ2fHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy50aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUXU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkFnPQp0aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuJGEudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUXUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSwKZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5Zaj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuUmg/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMubml8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuJGEudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy4kYS51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxUdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LHl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e3F4OiJBZENsaWNrVGhydSIsc3g6IkFkRXJyb3IiLHR4OiJBZFN0b3BwZWQiLHd4OiJBZExpbmVhckNoYW5nZSIseHg6IkFkVGFnUGFyc2VkIixBeDoiQWRWaWRlb0NvbXBsZXRlIixEeDoiQWRMb2FkZWQiLEV4OiJBZFNraXBwZWQiLEZ4OiJBZFN0YXJ0ZWQiLHV4OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsdng6IkFkSW1wcmVzc2lvbiIscng6IkFkQ3JlYXRpdmVWaWV3Iix5eDoiQWRWaWRlb01pZHBvaW50Iix6eDoiQWRQYXVzZWQiLEJ4OiJBZFZpZGVvU3RhcnQiLEN4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LHh1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMueXUoKTt0aGlzLkhhJiZ0aGlzLnh1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkFwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMubHA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMuWmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5BcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmxwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sZ3I6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkxvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLkVzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuUHEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sUHE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk14O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LERzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEVzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5EcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuZXAodGhpcy5GYS5jbGllbnRBUElzKX0sZXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlV1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5UdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5pcCgpO3RoaXMucXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuY3IuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sb3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLkp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxjcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMueHYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLnltP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMueW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx4djpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuV3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT3YoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5EdigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkV2KCkpfX0sRHY6ZnVuY3Rpb24oKXt0aGlzLkN2KCk7CnRoaXMuRnYoKX0sRnY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxFdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxDdjpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuSXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sSXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLkp2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxKdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5Cdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEJ2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGhwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy5ncigpKXt2YXIgYT10aGlzLk9xKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5TcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sZnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxBdjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGdwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMudHcuYmluZCh0aGlzKSx0aGlzLnN3LmJpbmQodGhpcykpfSx0dzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuaHEoKX0sc3c6ZnVuY3Rpb24oKXt9LApocTpmdW5jdGlvbigpe2UuQmMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHM9dGhpcy5hWzFdO3RoaXMuQW49dGhpcy5hWzEwXTt0aGlzLkRvPXRoaXMuYVsxXTt0aGlzLktpPXRoaXMuYVs5XTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLml1PXRoaXMuYVs4XTt0aGlzLlduPXRoaXMuYVs4XTt0aGlzLkJtPXRoaXMuYVszXTt0aGlzLmNzPXRoaXMuYVs2XTt0aGlzLlhwPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzldfWMuanQ9YjtiLnByb3RvdHlwZT17V3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlhzOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbjp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG86dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuY20oYSl9LGNtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZG06dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5pdTp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJtOnRoaXMuYnMoYSl9LGJzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jczp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmp0fHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5Xcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksCm11dGU6dGhpcy5QZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLmZ3LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuamI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5WYj10aGlzLlljPSExO3RoaXMuSm89MUUzO3RoaXMudGE9bnVsbDt0aGlzLkw9Yjt0aGlzLlBiPXt9O3RoaXMudmlkZW89e307dGhpcy5GZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Nbz1lLmFhKDEwKTt0aGlzLmxmPTA7dGhpcy5XYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLldjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0KITE7dGhpcy5saD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuZWU9ITE7dGhpcy5iaT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmFjPSExO3RoaXMudHA9ZS5hYSgxMCk7dGhpcy5HYj1lLmFhKDEwKTt0aGlzLkViPWUuYWEoMTApO3RoaXMuTWg9ZS5hYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUGQ9dGhpcy5PYj10aGlzLm9lPXRoaXMuZWQ9dGhpcy5HZD10aGlzLnNiPXRoaXMubWM9dGhpcy51aD10aGlzLmtkPXRoaXMuUnY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLkN0PTIwMDt0aGlzLkJmPXRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLlRqPWI7Yi5wcm90b3R5cGU9e0x1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiYKdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSwkaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5DYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLlphKCksITApO3RoaXMucXYoKTtlLnYoay5Jbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxLZTpmdW5jdGlvbihhLGIsYyxmKXt0aGlzLnViPWM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubGYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuaHAoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLApob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpmLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9CmE7dGhpcy5adSh0aGlzLmMpO3RoaXMudmQ9bmV3IFFhKHRoaXMuYy52dyx0aGlzLnZpZGVvLHt9KTt0aGlzLkxnKGEpO3RoaXMucmM9dGhpcy5DZyhhKTt0aGlzLm9wKCl9LExnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkZkPXRoaXMuWnEoYSkpLHRoaXMuTGcoYS5wYXJlbnQpKX0sQ2c6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnEoYSkpKTtyZXR1cm4gY30sSnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxacTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsCmFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmdkJiZhLmdkLmVycm9yJiZhLmdkLmVycm9yLmNvZGUmJihiPWEuZ2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5QYy5jb2RlOmI9PUcuV2QuY29kZT9lLnYoay5Sdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Kcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5mcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMucnYoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLnV3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LktmLmNvZGU6ZS52KGsuWXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWGQuY29kZTplLnYoay5neCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuS3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsucXcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsucncsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpOwpicmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLldiKGEpO3RoaXMuUmEoKX0sV2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5KZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sWnU6ZnVuY3Rpb24oYSl7dGhpcy5vZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLmx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJgooYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuU24mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuTW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTsKaWYodGhpcy5XaChiKSl7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5RbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuWmU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuWHUoKSk6dGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0sWHU6ZnVuY3Rpb24oKXt0aGlzLkFmPSEwO3RoaXMuc2I9dGhpcy5tYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5uZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5Sbih0aGlzLmMub3JpZ2luLnZhKTt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9CnRoaXMuUGI9dGhpcy5iLks7dGhpcy5naSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmJyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5nZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ3KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkd3KCksdGhpcy5iLiRiKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuS3coKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi4kYighMCksdGhpcy5PdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5NdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5OdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSncoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuSHcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuSXcoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxIdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLiRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm1jPSEwfSxJdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5tYz0hMX0sS3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxKdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5PaCgpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE93OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE13OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMua2Q9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE53OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LFB3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKX0sTHc6ZnVuY3Rpb24oKXt0aGlzLndmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbGk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5uZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sRnc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLlF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LApNbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuQXcuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksCnRoaXMuSm8pKX0seWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWWMmJnRoaXMuV2godGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5WYil7dGhpcy5ZYz0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC5zZ3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMueHcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMud3coKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHwKdGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmVkfHwoYT90aGlzLlJhKCk6KHRoaXMuUGUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5Hbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0sSm46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5HZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLm52KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5RZCYmdGhpcy5Kbih0aGlzLmMuUWQpO2lmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLk9zLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5FZD0hMTt0cnl7dGhpcy5iLmRpKCl9Y2F0Y2goZyl7fXRoaXMuR2Q9ITA7dGhpcy5iLkFlKCk7dGhpcy5hYz0hMTt0aGlzLndlKCkuRWgoKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUWUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucGgoKTp0aGlzLnBlKCkpfWVsc2UgdGhpcy5wZSgpfSxBdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5mcCgpOwp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxpaTpmdW5jdGlvbigpe2lmKHRoaXMuUnYpdGhpcy5SYSgpO2Vsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlV2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5rZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NaCkpJiYoYz10aGlzLmMua2YtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5FZD0hMSx0aGlzLmIuZGkoKSx0aGlzLmMub3JpZ2luLlFlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZWU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFV2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5PaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0scXY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiKwp0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxPaDpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scnY6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7ZS5LZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT0KYXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLiRxKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuamU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5GZC5pbXByZXNzaW9ucyYmZS5RcihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Ibix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT0KdGhpcy54cCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQWYmJihiPSJfdnBhaWQiKTt0aGlzLkNmJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEplOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuTG4oYyksZnx8KGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5ObihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sTm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG9wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sdHY6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYKIm9wZW4iPT10aGlzLmNjW2JdJiZhKys7cmV0dXJuIGF9LCRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0seHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0seHc6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnl3LmJpbmQodGhpcykpfSx5dzpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9CndpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlVifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5VYixhKX19LmJpbmQodGhpcyksNTAwKSl9LHd3OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPQoiI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLiRjJiYoYj10aGlzLkwuJGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJgoodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGdpOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9dGhpcy50cDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwKZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlR2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU3YuYmluZCh0aGlzKSk7CmcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0KMSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7Yy5hcHBlbmRDaGlsZChmKTt0aGlzLmMua2YmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sU3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LFR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy50digpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuQ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5DdSgpLHRoaXMuYWM9ITEsCmUudihrLnNwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5Uanx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTmo9dGhpcy5hWzhdO3RoaXMuYnU9dGhpcy5hWzEwXTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMucHI9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5qOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5idTp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5wcnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuTWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLnRzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuV209YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPQoiTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuc3MuYmluZCh0aGlzKSx0aGlzLnBzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpOwpjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5WcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5BdigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxWcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LHNzOmZ1bmN0aW9uKGEpe3RoaXMubHUoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sdHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LlhkKSl9dGhpcy5ZPXRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnNhKHRoaXMuU2Eody5QYyx7ZXJyb3I6dGhpcy56Zj9HLldkOkcuSWZ9KSl9LHBzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSGYse2RlcHRoOmF9KSl9LEljOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuWHIoKT90aGlzLkt2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLklxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5LZikpOihhPTAsdGhpcy5vdygpJiZ0aGlzLlZlKHRoaXMudXAoKSkpfSxRZTpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQuUWUoKX0scGg6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LnBoKCl9LG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHYoKT90aGlzLkd2KCk/ITA6KC0xIT10aGlzLkNjKCk/dGhpcy5zYSh0aGlzLlNhKHcuU2QpKTp0aGlzLnNhKHRoaXMuU2Eody5EZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuUGMsRy5KZikpLCExKX0sVmU6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuUWR8fChhLlFkPVtdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMucGFyZW50LlZlKGEpfSx1cDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkNjKCk7YS5PPXRoaXMuSmcoKTthLlViPXRoaXMuS3EoKTthLnZ3PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuSHEoKTthLmtmPXRoaXMuWXEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5TZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHEoKSk6Yi5QYS5jb25jYXQodGhpcy5UcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuV2ImJnRoaXMucGFyZW50LldiKGIpLGE9MCx0aGlzLkljKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sV2I6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuV2IoYSl9LHRnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LEt2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkpnKCkubGVuZ3RofSxHdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnBmKCkmJihhPSEwKTtyZXR1cm4gYX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFhyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5NZygpLmxlbmd0aH0sTWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxJcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE1lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuJGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSwkZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLiRnKGEucGFyZW50Tm9kZSk6ITF9LFRxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSxMcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sSmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksTng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEhxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxDYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5tdihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnllKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5XbXx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy50bz10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5abz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLiRyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMueXE6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLldpOnRoaXMuc28oYSl9LHNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50bzp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubnQ6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlpvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy4kcnx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MueHEoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDsKdGhpcy5DZT0iIn1jLmltPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KITA7cmV0dXJuIGF9LFJxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuUnEoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LGJyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9CjA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9CmMuaW18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLnR0PXRoaXMuYVsxXTt0aGlzLk1wPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs0XTt0aGlzLlNzPXRoaXMuYVsxMF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbMV07dGhpcy5HbT10aGlzLmFbNV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLiRpPWI7Yi5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbzp0aGlzLnN0KGEpfSxzdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHQ6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1wOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlNzOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HaTp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaG86dGhpcy5GbShhKX0sRm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkdtOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VaTp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLiRpfHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5rbyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LApEZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUGM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LG94Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0scHg6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWw9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNV19Yy5EdD1iO2IucHJvdG90eXBlPXtobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkR0fHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5obCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5nZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkJqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Canx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzVdO3RoaXMua3U9dGhpcy5hWzJdO3RoaXMuYWs9dGhpcy5hWzldO3RoaXMuSW09dGhpcy5hWzZdO3RoaXMuSXU9dGhpcy5hWzJdO3RoaXMucHQ9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzhdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmR4PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuUG09YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZuOnRoaXMuanUoYSl9LGp1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5rdTp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmFrOnRoaXMuSG0oYSl9LEhtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JbTp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXU6dGhpcy5vdChhKX0sb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnB0OnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5UbTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5YayhhKX0sWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllrOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5keDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuUG18fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy56dz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMubWw9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmh5PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnp1LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLnF1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5OZC5wdXNoKHtzcmM6YyxmcmFtZTpnLEl0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5NcShhKSl9fSxNcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntxeTohMCxweTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntkeToidmlkZW8iLHN5OiJqc0N1c3RvbSIsdHk6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCx1eToxLE94OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsCm9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5JdDtyZXR1cm4iIn0senU6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmFyKGIpLHZlbmRvcjpifSk7dGhpcy5wdigpfSxxdTpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuencubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGIpfSxhZzpmdW5jdGlvbihhLGIpe3RoaXMuUmUucHVzaCh7dHlwZTphLFZvOmIsbnk6ITF9KX0scHY6ZnVuY3Rpb24oKXt0aGlzLkNoLm1hcChmdW5jdGlvbihhKXthLlRyfHwoYS5neSh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0IiwKdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnJ5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Ucj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5tbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuJHQ9dGhpcy5hWzRdO3RoaXMuZXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5PbT1iO2IucHJvdG90eXBlPXtmbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2w6dGhpcy5adChhKX0sWnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiR0OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuT218fFphLEtjPW5ldyBaYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5mbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmpiPWEuRWcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5iZz0hMTt0aGlzLlRiPVtdfWMubWo9YjtiLnByb3RvdHlwZT17Q3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJgooYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuQ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLmpyKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fApkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx3djpmdW5jdGlvbigpe3RoaXMuYmc9ITB9LGRpOmZ1bmN0aW9uKCl7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx2aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnljLHRoaXMuZi5zKCkpfSxDdTpmdW5jdGlvbigpe3RoaXMuYmd8fCh0aGlzLmYucGxheSgpLGUudihrLmRkLHRoaXMuZi5zKCkpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpOwp0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmpiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLkxjJiZ0aGlzLmYuTGMoKT90aGlzLmYuRWcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksCjEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sanI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG9xOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPQp0aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5BZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuTGMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLlBoKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwKMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy5tanx8JGEsRT1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHI9dGhpcy5hWzEwXTt0aGlzLmR1PXRoaXMuYVszXTt0aGlzLlF2PXRoaXMuYVs0XTt0aGlzLndsPXRoaXMuYVs3XTt0aGlzLkh0PXRoaXMuYVs1XTt0aGlzLkNwPXRoaXMuYVs1XTt0aGlzLkdxPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzRdfWMuZ3U9YjtiLnByb3RvdHlwZT17Q3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRyOnRoaXMuY3UoYSl9LGN1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdTp0aGlzLlB2KGEpfSxQdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUXY6dGhpcy52bChhKX0sdmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSHQ6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNwOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmhuKGEpfSxobjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuam46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLmd1fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy5IbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkJkKGIpO3RoaXMucGcoKX0sQmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHBnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuS2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLkhsfHxjYjsoZnVuY3Rpb24oYyl7Yy5HbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVGY9dGhpcy5WZj10aGlzLldnPXRoaXMuZWE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5tcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5XZyYmdGhpcy5qZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5iZCgpO3RoaXMuV2c9ITA7dGhpcy5qZygpfS5iaW5kKHRoaXMpKTt0aGlzLmZnKCl9LApqZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmJkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmJkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5UZiYmIXRoaXMuVmYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxiZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sS2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZmc6ZnVuY3Rpb24oKXtpZih0aGlzLmJkKCkpe3ZhciBiPXRoaXMuS2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuVmY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5UZj1iLkx4fXRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sUHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuYnkoKTohMX0sQ2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkNjKCk6LTF9LFVxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LG1xOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkRlKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuVXEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5HbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuSWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxVcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5tbS5Ebi5Cbj93aW5kb3cuT08ubW0uRG4uQm4uSngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj0KZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUueGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5JbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpqPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzRdfWMudW49YjtiLnByb3RvdHlwZT17aWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7CnZhciBnYj1jLnVufHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5paig0KTsoZnVuY3Rpb24oYyl7Yy5laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLm5hPSExO3RoaXMuTmcoKX0sTmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMueWgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWgoKX0uYmluZCh0aGlzKSwxMDApfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZ2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5nZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxCaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuQmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMubnF8fCh0aGlzLm5xPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5CaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkJoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVD1uZXcgamIocik7VC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXA9dGhpcy5hWzFdO3RoaXMuZng9dGhpcy5hWzldO3RoaXMuRm89dGhpcy5hWzNdO3RoaXMuenI9dGhpcy5hWzRdO3RoaXMudXE9dGhpcy5hWzhdO3RoaXMuaGs9dGhpcy5hWzRdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMTBdfWMuaGo9CmI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VcDp0aGlzLmV4KGEpfSxleDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ4OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gbzp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenI6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVxOnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5oazp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmk6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5oanx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLlRwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5EbXx8VTsoZnVuY3Rpb24oYyl7Yy5DbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlRzKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpOwp4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5mcigpfSxUczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5DbXx8VjsoZnVuY3Rpb24oYyl7Yy5FbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuenAoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8Cih0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxMdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuQnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGZyOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguTHYoYil9fSl9KShjKTt2YXIgbGI9Yy5FbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucWo9dGhpcy5hWzldO3RoaXMuWG89dGhpcy5hWzJdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuZW49dGhpcy5hWzNdO3RoaXMub2o9dGhpcy5hWzZdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy4kdT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucWo6dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ydzp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5uaihhKX0sbmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vajp0aGlzLkptKGEpfSxKbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTsKdmFyIG1iPWMuJHV8fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnBqKDQpOyhmdW5jdGlvbihjKXtjLmFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sCkFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fG9iOyhmdW5jdGlvbihjKXtjLmNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5JKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuY2p8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbMV07dGhpcy5FdT10aGlzLmFbMTBdO3RoaXMucnI9dGhpcy5hWzddO3RoaXMuJGw9dGhpcy5hWzZdOwp0aGlzLmo9dGhpcy5hWzVdfWMuVnA9YjtiLnByb3RvdHlwZT17Q2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRsOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucnI6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5WcHx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuQ2woNCk7KGZ1bmN0aW9uKGMpe2MuQWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLnB1KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LHB1OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuQWx8fHNiOyhmdW5jdGlvbihjKXtjLnpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy56bHx8dGI7KGZ1bmN0aW9uKGMpe2MuQmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5CbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmN3PXRoaXMuYVsxXTt0aGlzLk9vPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuaXE9YjtiLnByb3RvdHlwZT17Ync6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmN3OnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT286dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5pcXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuYncoNCk7KGZ1bmN0aW9uKGMpe2MuYW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuYW58fHdiOyhmdW5jdGlvbihjKXtjLiRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxudTpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPVtdKTt0aGlzLmZiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT0KYS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5DYT90aGlzLm51KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmZiJiYKdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuJG18fHhiOyhmdW5jdGlvbihjKXtjLmJuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksCihuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuYm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ddz10aGlzLmFbOF07dGhpcy5xaz10aGlzLmFbM107dGhpcy52bz10aGlzLmFbMl07dGhpcy4kbj10aGlzLmFbMV07dGhpcy5Ydj10aGlzLmFbN107dGhpcy54cj10aGlzLmFbNF07dGhpcy5ueD10aGlzLmFbOF07dGhpcy5PcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkdvPWI7Yi5wcm90b3R5cGU9e0J3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWs6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuJG46dGhpcy5XdihhKX0sV3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlh2OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLm14KGEpfSxteDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubng6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuR298fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkJ3KDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTnQoKX0uYmluZCh0aGlzKSw1MDApfSxOdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHN2OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMudW18fEJiOyhmdW5jdGlvbihjKXtjLnRtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Bcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Bcz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuc3YoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLnRtfHxDYjsoZnVuY3Rpb24oYyl7Yy52bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMudm18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adj10aGlzLmFbNF07dGhpcy5Wdz10aGlzLmFbMl07CnRoaXMuRGk9dGhpcy5hWzNdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMucm49dGhpcy5hWzEwXTt0aGlzLmZ2PXRoaXMuYVs1XTt0aGlzLm5wPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzRdfWMuZHM9YjtiLnByb3RvdHlwZT17WXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlp2OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wdzp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRGk6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhpOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy5kc3x8CkZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLll2KDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMucm18fEdiOyhmdW5jdGlvbihjKXtjLnFtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTsKdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuanMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0scXA6ZnVuY3Rpb24oKXt0aGlzLlJmKCl8fHRoaXMubSghMCl9LGpzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpOyFiLnFhJiZiLlkmJmIuSXgmJmIuS3gmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwKIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnRoPWJbY10pO3JldHVybiB0aGlzLnRofSwKY3k6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5xbXx8SGI7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLnNtfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2o9dGhpcy5hWzZdO3RoaXMubnc9dGhpcy5hWzhdO3RoaXMud3E9dGhpcy5hWzhdO3RoaXMucG89dGhpcy5hWzNdO3RoaXMuYXQ9dGhpcy5hWzJdO3RoaXMubGs9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ubT1iO2IucHJvdG90eXBlPXt2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy5sdyhhKX0sbHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm53OnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5wbzp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXQ6dGhpcy5rayhhKX0sa2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxrOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMubm18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLnZqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGF5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLmtsfHxYOyhmdW5jdGlvbihjKXtjLmpsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlhlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuaXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmpsfHxZOyhmdW5jdGlvbihjKXtjLmxsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5iZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLmxsfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdD10aGlzLmFbOV07dGhpcy5jaz10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMTBdO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuUWk9dGhpcy5hWzJdO3RoaXMudHI9dGhpcy5hWzhdO3RoaXMuZXc9dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuRHA9YjtiLnByb3RvdHlwZT17S3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkx0OnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5jazp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubG46dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmx0OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5RaTp0aGlzLnNyKGEpfSwKc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRyOnRoaXMuZHcoYSl9LGR3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldzp0aGlzLm5rKGEpfSxuazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub2s6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5EcHx8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSwKYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sS3U6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGZ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuUmp8fE9iOyhmdW5jdGlvbihjKXtjLlFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuUWp8fFBiOyhmdW5jdGlvbihjKXtjLlNqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGImJmIuR2V0QWxsUGxheWVycyYmKGI9Yi5HZXRBbGxQbGF5ZXJzKCkpJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5uYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuU2p8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udz10aGlzLmFbMV07dGhpcy5ibT10aGlzLmFbOF07dGhpcy5qbz10aGlzLmFbMl07dGhpcy5Jbz10aGlzLmFbM107dGhpcy5ieD10aGlzLmFbM107dGhpcy5jcT10aGlzLmFbM107dGhpcy53bj10aGlzLmFbOF07dGhpcy5Mcj10aGlzLmFbOF07CnRoaXMuWnM9dGhpcy5hWzJdO3RoaXMuaG09dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy51dD1iO2IucHJvdG90eXBlPXtTdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHc6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmJtOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbzp0aGlzLkhvKGEpfSxIbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklvOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ieDp0aGlzLmJxKGEpfSxicTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3E6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWnM6dGhpcy5nbShhKX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5obTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMudXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLlN3KDQpOyhmdW5jdGlvbihjKXtjLm5uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LExkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50PwphPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sb3U6ZnVuY3Rpb24oKXt0aGlzLlJkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5SZHx8KHRoaXMuUmQ9ITAsdGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5ubnx8VGI7KGZ1bmN0aW9uKGMpe2MubW49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sc3U6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmFkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLnN1KHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpO3RoaXMuTmYoKTt0aGlzLnJ1KCl9LHJ1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKCl7fSl9LG06ZnVuY3Rpb24oYil7dGhpcy5tdT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLm11PSEwfX0pfSkoYyk7dmFyIFViPWMubW58fFViOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIub3UoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLnBufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5PaT10aGlzLmFbMl07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Qaj10aGlzLmFbNV07dGhpcy5Baj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNF07dGhpcy5kdD10aGlzLmFbNl07dGhpcy5qaz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnlwPWI7Yi5wcm90b3R5cGU9e05pOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2k6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZzOnRoaXMuT2ooYSl9LE9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qajp0aGlzLnpqKGEpfSx6ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWo6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnBpOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ObDp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZHQ6dGhpcy5payhhKX0sCmlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMueXB8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLk5pKDQpOyhmdW5jdGlvbihjKXtjLk1tPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMud2g9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuRnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEt1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZzfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLndoJiYodGhpcy53aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuTW18fE87KGZ1bmN0aW9uKGMpe2MuTG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnRlKWlmKHRoaXMuRGJ8fAoodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5XdSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPQpiLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5MbXx8UDsoZnVuY3Rpb24oYyl7Yy5ObT0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHwKdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5iZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuTm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaz10aGlzLmFbOV07dGhpcy5Cbz10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbN107dGhpcy54bT10aGlzLmFbM107dGhpcy5Jaj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs3XX1jLlhpPWI7Yi5wcm90b3R5cGU9e0hrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jazp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Dazp0aGlzLndtKGEpfSx3bTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG06dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLlhpfHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5Iayg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVyhhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlRrfHxaOyhmdW5jdGlvbihjKXtjLlNrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlRnPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRWM9dGhpcy5DYT10aGlzLlhjPSExO3RoaXMuQWg9ZS5IYigxMCk7dGhpcy5iaCgpfSxiaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5xYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlRnKys7aWYoMTA8dGhpcy5UZyl0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmCndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5iaC5iaW5kKHRoaXMpLDEwMCksITF9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudygpLAp0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuU2t8fGFhOyhmdW5jdGlvbihjKXtjLlVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLApiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuVWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pdD10aGlzLmFbMl07dGhpcy5scj10aGlzLmFbMl07dGhpcy53dD10aGlzLmFbMl07dGhpcy5Gcj10aGlzLmFbNV07dGhpcy5zcT10aGlzLmFbNF07dGhpcy5IcD10aGlzLmFbN107dGhpcy5zaj10aGlzLmFbNl07dGhpcy5GbD10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLklwPWI7Yi5wcm90b3R5cGU9e2h0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pdDoKdGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxyOnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Q6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZyOnRoaXMucnEoYSl9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3E6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zajp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRmw6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuSXB8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5odCg0KTsoZnVuY3Rpb24oYyl7Yy5Laj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLktqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSwKaGc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkpqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTGp8fGZjLGdjPQpuZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnY9dGhpcy5hWzVdO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzJdO3RoaXMuUXM9dGhpcy5hWzEwXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuTms9YjtiLnByb3RvdHlwZT17YXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJ2OnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaTp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU2w6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuTmt8fGhjLApaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hdig0KTsoZnVuY3Rpb24oYyl7Yy5zaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5zaXx8aWM7KGZ1bmN0aW9uKGMpe2Mucmk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PQp0eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmCmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fAozMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5lZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLAoxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsoZnVuY3Rpb24oYyl7Yy50aT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMudGl8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR3U9dGhpcy5hWzNdO3RoaXMud3M9dGhpcy5hWzZdO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy5FaT1iO2IucHJvdG90eXBlPXtGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd1OnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53czp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLkVpfHxtYywkYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5laD10aGlzLmdoPXRoaXMuZmg9ITE7dGhpcy54ZD1bXTt0aGlzLmFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PQp0eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5rbT1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlZxKGEpOltdLGI7dGhpcy5naD0hMDtpZihhLmxlbmd0aCl7dGhpcy5maD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5IaChiKX1lbHNlIGZvcihjIGluIHRoaXMuYWYpe2lmKHRoaXMuZWgpYnJlYWs7Yj10aGlzLmFmW2NdO3RoaXMudmYoYikmJih0aGlzLnhkLnB1c2goYiksdGhpcy5IaChiKSl9fSwKdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSx1djpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLmttfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hcD10aGlzLmFbN107dGhpcy5Odj10aGlzLmFbNF07CnRoaXMuR2o9dGhpcy5hWzFdO3RoaXMudWw9dGhpcy5hWzEwXTt0aGlzLlJrPXRoaXMuYVszXTt0aGlzLmxzPXRoaXMuYVsxXTt0aGlzLnJvPXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs5XTt0aGlzLnRuPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuZms9YjtiLnByb3RvdHlwZT17JG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFwOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Odjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2o6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bDp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUms6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxzOnRoaXMucW8oYSl9LHFvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybzp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5hbDp0aGlzLlBwKGEpfSxQcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFwOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuZmt8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLiRvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPQpjLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5CYyhrLnB3KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5CYyhrLkxzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7CnZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5ZZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnlnKHdpbmRvdyxJLkpyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xaz10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbOF07dGhpcy5zbD10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbOV07dGhpcy5Ubz10aGlzLmFbOF07dGhpcy5kdj10aGlzLmFbNl07dGhpcy5xbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLlprPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV2s6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRvOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdjp0aGlzLnBsKGEpfSxwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5aa3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPQp0aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmViPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy51aT1iO2IucHJvdG90eXBlPXtTdTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5lYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sTnU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxNdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrCmVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5NcigpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIud2EsdGhpcy5uYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkFjKTtlbHNlIGlmKHRoaXMuaHIoKSl0aGlzLkp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLnd2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpOwpSPWw9bmV3IFJhKGwsdGhpcy5uYixnKTtsLkx1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy56cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxNcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LGp2OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpOwplLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0saXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLlN1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx2dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLll1KHRoaXMuaXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSx1dTpmdW5jdGlvbigpe3RoaXMucGxheWVyLlJ1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuanYoKTt0aGlzLnBsYXllci5OZSYmdGhpcy51dSgpO3RoaXMudnUoKX0sd3U6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuangoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxocjpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sSnU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLlZ0LmJpbmQodGhpcykpfSxWdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0senM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS3A9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzNdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuVW49dGhpcy5hWzZdO3RoaXMuQWs9dGhpcy5hWzddOwp0aGlzLmZtPXRoaXMuYVs3XTt0aGlzLnNrPXRoaXMuYVsxXTt0aGlzLklyPXRoaXMuYVs1XTt0aGlzLkJyPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuWmk9YjtiLnByb3RvdHlwZT17SnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktwOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy52cjp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucnQ6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLmVtKGEpfSxlbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZtOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zazp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSXI6dGhpcy5BcihhKX0sQXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Ccjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuWml8fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkpwKDQpfSkuY2FsbChVbmFodmFtdXF1YWh0b29WLFVuYWh2YW11cXVhaHRvb1YpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.244.75 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.75.244.243.136.clients.your-server.de
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101?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
Sat, 12 Oct 2019 21:45:46 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
de36-homad-5
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
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 9DC8
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.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
/safeframe/1-0-35/html/container.html?n=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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Sat, 12 Oct 2019 19:54:51 GMT
expires
Sun, 11 Oct 2020 19:54:51 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
6654
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 335A
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
128869a25131fc642133dda16f4e88b723e1623e20234a39d260a1f0267c518f
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570792838566027"
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
29055
x-xss-protection
0
expires
Sat, 12 Oct 2019 21:45:45 GMT
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=1173
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
B0ifqy7kTSRMisP8EQOLSQIlEgQOBuwlngT88E/RewsSP5wLKrSgyb4K1VeM7/4XxSFw9SyUpVU=
a0aa592d-3ce6-4625-ad5e-55b804a081f9
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a0aa592d-3ce6-4625-ad5e-55b804a081f9?aid=182yo&floor=YTBhYTU5MmQtM2NlNi00NohGeThlFIvmZgMIXg&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ts=1570916746
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1173
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:45 GMT
via
1.1 google
last-modified
Sat, 12 Oct 2019 21:45:45 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
4766719661
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
297 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4766719661
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
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:49 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/4766719661
Transfer-Encoding
chunked
Content-Type
application/json
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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&encoded=1&uid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1570916746167&tagid=&cntry=NL&platform=1&sesid=7aaf1cb3e5c2e9e1c54d03b42a7db66f&itemid=/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen&viewid=1570916744703&geolat=&geoing=&deviceifa=&appid=&sd=v2_7aaf1cb3e5c2e9e1c54d03b42a7db66f_54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09_1570916745_1570916745_CNawjgYQrMVBGP_7vI_cLSABKAEwoQE4l-oLQJuXEEjDohJQ____________AVgAYAA&ri=54f0b7285a5a8cc06b22a198103dd895&appname=&cdb=&gdprApplies=&rid=&sii=-8541024544462221397
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.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
f0b68b83fd47e1b4672a272a736e7285fced839c6c306a3f5500b168d1f70e11

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916746.227711,VS0,VE14
machineid
1451
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-hhn4044-HHN
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
35
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
1288
x-amz-id-2
ojKi+56ZZzC7CRaFJGuJdERQlsGnyv1dE9ivNDN/Ga2UF3fiRjhtjpYbxc0IDh02AmEvECwVCBA=
x-served-by
cache-fra19129-FRA
last-modified
Wed, 02 Oct 2019 22:32:38 GMT
server
AmazonS3
x-timer
S1570916746.182954,VS0,VE0
date
Sat, 12 Oct 2019 21:45:46 GMT
vary
Accept-Encoding
x-amz-request-id
5B752BEC5C7C37E2
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
49
x-cache-hits
70
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
4
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
AWcIhzzomFpHe8si5YbJiVnnNX5t8zaqWT6iUnl1jrs0orHCeA8qFpBimZz6F0EbOu64vJC5TJQ=
x-served-by
cache-fra19129-FRA
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1570916746.188163,VS0,VE0
date
Sat, 12 Oct 2019 21:45:46 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
581ABC3EA067DAB9
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
49
x-cache-hits
4
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
42
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
7734
x-amz-id-2
yQl1Fm7tqYqYrYe/EfcUkq9+h/hVyinSiT8nMh+8vAWL6qurNr3Sx7XmDlERqzwCkZW4vUU8YFA=
x-served-by
cache-fra19129-FRA
last-modified
Wed, 02 Oct 2019 22:32:45 GMT
server
AmazonS3
x-timer
S1570916746.199722,VS0,VE0
date
Sat, 12 Oct 2019 21:45:46 GMT
vary
Accept-Encoding
x-amz-request-id
05AEECAB7410CA91
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
49
x-cache-hits
16
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame 04BE
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=3f5726d9-e75c-4178-ba0f-8f282838a9c7
0
55 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3f5726d9-e75c-4178-ba0f-8f282838a9c7
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916747.637183,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4039-HHN

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3f5726d9-e75c-4178-ba0f-8f282838a9c7
Date
Sat, 12 Oct 2019 21:45:46 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 04BE
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
de8527bfa1ccfd6c1590da0d3b6cff52
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 04BE
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=dRhnRXI0IQPfsWjrIwW_BOv7JXN-pYSomNBlc9lpAvA%3D
45 B
95 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dRhnRXI0IQPfsWjrIwW_BOv7JXN-pYSomNBlc9lpAvA%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:47 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916748.553588,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4039-HHN

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dRhnRXI0IQPfsWjrIwW_BOv7JXN-pYSomNBlc9lpAvA%3D
Date
Sat, 12 Oct 2019 21:45:47 GMT
Server
nginx
Connection
close
Etag
"dRhnRXI0IQPfsWjrIwW_BOv7JXN-pYSomNBlc9lpAvA="
Content-Length
0
getuidnb
ib.adnxs.com/ Frame 04BE
43 B
692 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

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

Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:48 GMT
X-Proxy-Origin
109.236.81.142; 109.236.81.142; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.40:80
AN-X-Request-Uuid
c4827a04-ef39-4da9-a6dc-793e4a897b88
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
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/google-network/1/ Frame 04BE
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=CAESEFzez345UykwyfCtjhYb6ik&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFzez345UykwyfCtjhYb6ik&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3DCAESEFzez345UykwyfCtjhYb6ik%26goo...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFzez345UykwyfCtjhYb6ik&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3DCAESEFzez345UykwyfCtjhYb6ik%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916746.268100,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN

Redirect headers

date
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916746.237293,VS0,VE9
x-served-by
cache-hhn4039-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFzez345UykwyfCtjhYb6ik&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3DCAESEFzez345UykwyfCtjhYb6ik%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
getuidnb
ib.adnxs.com/ Frame 04BE
43 B
693 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

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

Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:48 GMT
X-Proxy-Origin
109.236.81.142; 109.236.81.142; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.200:80
AN-X-Request-Uuid
88b3f241-6f07-401b-8087-acfdeda7fcc2
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
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame 04BE
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=8cf74ec6-13bd-498a-9498-388897df1217
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=8cf74ec6-13bd-498a-9498-388897df1217&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D8cf74ec6-13bd-498a...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=8cf74ec6-13bd-498a-9498-388897df1217&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D8cf74ec6-13bd-498a-9498-388897df1217
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916746.367628,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN

Redirect headers

date
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916746.337430,VS0,VE8
x-served-by
cache-hhn4039-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=8cf74ec6-13bd-498a-9498-388897df1217&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D8cf74ec6-13bd-498a-9498-388897df1217
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame 04BE
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D2f86422f-4277-4159-ad...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D2f86422f-4277-4159-ada2-5b96c952e577
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:47 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916747.234218,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN

Redirect headers

date
Sat, 12 Oct 2019 21:45:47 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916747.204300,VS0,VE8
x-served-by
cache-hhn4039-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=2f86422f-4277-4159-ada2-5b96c952e577&tbid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&query=taboola_hm%3D2f86422f-4277-4159-ada2-5b96c952e577
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame 04BE
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Track002-dc3
Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:49 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 04BE
0
293 B
Image
General
Full URL
https://cds.taboola.com/?uid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09&_r=1584059
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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
Sat, 12 Oct 2019 21:45:46 GMT
Via
1.1 varnish
Server
nginx/1.12.2
X-Timer
S1570916747.532660,VS0,VE23
X-Served-By
cache-dca17736-DCA
X-Cache
MISS
x-envoy-upstream-service-time
0
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
sync
a.twiago.com/%%202Fx.bidswitch.net/ Frame 04BE
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://a.twiago.com/rtb/usermatch.php?umid=10&userid=&call_type=redirect&rtbprovider=openrtb&%20gdpr=&gdpr_consent=&redirecturl=https%3A%2F%%202Fx.bidswitch.net%2Fsync%3Fdsp_id%3D397%26user_id%3D%...
  • https://a.twiago.com/%%202Fx.bidswitch.net/sync?dsp_id=397&user_id=42376881a969c31e98c5699ff8f9ae75c854e000ad1de9933d52252dfd5de&ssp=%20taboola&bsw_param=e592ba60-3a61-4660-ae12-4d8197a233f2
0
0
Image
General
Full URL
https://a.twiago.com/%%202Fx.bidswitch.net/sync?dsp_id=397&user_id=42376881a969c31e98c5699ff8f9ae75c854e000ad1de9933d52252dfd5de&ssp=%20taboola&bsw_param=e592ba60-3a61-4660-ae12-4d8197a233f2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.215.5.31 , Germany, ASN6724 (STRATO STRATO AG, DE),
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

Location
https:/% 2Fx.bidswitch.net/sync?dsp_id=397&user_id=42376881a969c31e98c5699ff8f9ae75c854e000ad1de9933d52252dfd5de&ssp= taboola&bsw_param=e592ba60-3a61-4660-ae12-4d8197a233f2
Date
Sat, 12 Oct 2019 21:45:49 GMT
Server
Apache
P3P
policyref="https://help.adspirit.de/w3c/adspirit.p3p", CP="NOI DSP COR NID PSAo PSDo IVAo IVDo OUR STP UNI COM NAV DEM"
Content-Length
0
Content-Type
text/html; charset=ISO-8859-1
collect
www.google-analytics.com/
35 B
109 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=519741500&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&ul=en-us&de=UTF-8&dt=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&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=476472762.1570916744&tid=UA-204785-4&_gid=478699026.1570916744&cd1=Martin%20Maciej&cd5=2015-03-26T15%3A59%3A14%2B01%3A00&cg1=Themenspecials&cg2=2762702&cg3=05-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=880746589
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Wed, 09 Oct 2019 22:35:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
256204
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
98 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916746.216122,VS0,VE8
x-served-by
cache-hhn4039-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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1570916746.217314,VS0,VE9
x-served-by
cache-hhn4039-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
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
681 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/userx.20191002-10-RELEASE.es6.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
6824
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19129-FRA
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
S1570916746.233711,VS0,VE0
date
Sat, 12 Oct 2019 21:45:46 GMT
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
49
x-cache-hits
5535
activeview
pagead2.googlesyndication.com/pcs/ Frame D1F4
42 B
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvvw5MOSUR-EgU40OT_gWKMcgayc9eUsL7vVAXR8TKE7-hBMAVX_3PymQIdi3iY5LjSoZsJXqB5L0-HeV6xgm8sSYeBj_u9HteV6KMxTRw&sig=Cg0ArKJSzDxKM7jabg7EEAE&adk=3040188762&tt=-1&bs=1585%2C1185&mtos=1073,1073,1073,1073,1073&tos=1073,0,0,0,0&p=121,429,211,1157&mcvt=1073&rs=3&ht=0&tfs=758&tls=1831&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=554&niot_cbk=558&md=2&lm=2&rst=1570916744964&rpt=184&isd=0&msd=0&oseid=3&xdi=0&ps=1618%2C4817&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-27-18-12-116-16-0-0-0&tvt=1825&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191011
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 GMT
via
1.1 a436b6df4b0d1bd189edf722b5d2a523.cloudfront.net (CloudFront), 1.1 varnish
age
2404377
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-fra19129-FRA
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1570916746.425839,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
FRA50
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Bz1oMGf3im0GdaDR1lpP366TMdyCBt5NXOq1IlamWrJqJW2zqe6XsA==
x-cache-hits
690088
userconnect
ih.adscale.de/
95 B
364 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1570916746276&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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
Sat, 12 Oct 2019 21:45:46 GMT
st
imprammp.taboola.com/ Frame 2EE4
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=E9A38D8CCB3307341871301000876&cicmp=1657475&cijs=1&dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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=E9A38D8CCB3307341871301000876&cicmp=1657475&cijs=1&dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=54eb1005-83d0-4262-99c4-02027d08f3b1-tuct49bcf09
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:45:46 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916746.476640,VS0,VE9
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 GMT
via
1.1 d8328954e51c0912a8419c1a67cea1dc.cloudfront.net (CloudFront), 1.1 varnish
age
892361
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-fra19129-FRA
last-modified
Wed, 02 Oct 2019 13:50:46 GMT
server
AmazonS3
x-timer
S1570916746.487348,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
FRA2-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Dlu1TcD0MoXj2P-Ywl-iyRhN5SIY0jyCD7EYTTFeRit2DaB7SbSbnQ==
x-cache-hits
527130
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 GMT
via
1.1 d8328954e51c0912a8419c1a67cea1dc.cloudfront.net (CloudFront), 1.1 varnish
age
892361
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-fra19129-FRA
last-modified
Wed, 02 Oct 2019 13:50:40 GMT
server
AmazonS3
x-timer
S1570916746.473788,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
FRA2-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
K_S9bnFbD3OkN1pxw0iJ_GxM2UezskcDXOJUz7h9PJ_-Fa9C0gb1lw==
x-cache-hits
688227
activeview
pagead2.googlesyndication.com/pcs/ Frame 9DE7
42 B
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstMztKGqGZRkD-DEp59mtZ0xzvO1wRw8mz34TdWh4ldU2FxS_ZFashSg6ovidHhAVp2JUtFJ7lvBGplXVpp4xwRI4-6nByZaqjr8kaOWnA&sig=Cg0ArKJSzA2_KEUGpSPOEAE&adk=2089391793&tt=-1&bs=1585%2C1185&mtos=0,1079,1079,1079,1079&tos=0,1079,0,0,0&p=121,1318,721,1618&mcvt=1079&rs=3&ht=0&tfs=976&tls=2055&mc=0.89&lte=0.89&bas=0&bac=0&met=no&avms=nio&niot_obs=732&niot_cbk=736&md=2&lm=2&rst=1570916745142&rpt=152&isd=0&msd=0&oseid=3&xdi=0&ps=1618%2C4817&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-32-20-12-130-18-0-0-0&tvt=2052&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191011
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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
Cookie set map
ih.adscale.de/ Frame 89C4
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Accept-Encoding
gzip, deflate, br
Cookie
uu=f32e680bba86491089c728b9b1bd3737; tu=4#3034208634#48~2ed5fc200b5d894b3c223bc281540bb7~436365~0~0; ng=2#1367523975#26181945#0#d7~1&d10~1&d4~1&d11~3&d8~2&d9~2&d12~3&d1~1&d3~4
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Sat, 12 Oct 2019 21:45:46 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:46 GMT
Content-Length
673
Connection
keep-alive
Set-Cookie
tu=4#2592767279#48~2ed5fc200b5d894b3c223bc281540bb7~436365~0~0#101~~436365~436365~1#38~~436365~436365~1#39~~436365~436365~1#40~~436365~436365~1#72~~436365~436365~1#42~~436365~436365~1#75~~436365~436365~1#63~~436365~436365~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
activeview
pagead2.googlesyndication.com/pcs/ Frame 335A
42 B
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstsUh1lTH4xOnrMzRt0VGlKLF7HD7X4ZA3R-MCRPTyq6lcc9j443TPuhomUhiMveYX-RPSWKiK-igYitoSvshGEAWOqmU_E1oXElCE-Vts&sig=Cg0ArKJSzMItUfdA0XLBEAE&adk=3694558186&tt=-1&bs=1585%2C1185&mtos=1028,1028,1028,1028,1028&tos=1028,0,0,0,0&p=278,968,528,1268&cm=1&mcvt=1028&rs=0&ht=0&tfs=109&tls=1137&mc=1&lte=1&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&lm=2&rst=1570916745342&dlt=0&rpt=153&isd=0&msd=0&xdi=0&ps=1618%2C4817&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-6-11-2-10-10-0-0-0&tvt=1137&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191011
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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
teads-format.min.js
a.teads.tv/media/format/v3/
708 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
e401c7e132d89c8041b8d89f728dc00af6c3ebb6560d16e51162ad7c0b34cf53

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:46 GMT
content-encoding
gzip
last-modified
Fri, 11 Oct 2019 14:38:33 GMT
x-amz-request-id
6CC808516C3C6F97
etag
"496b1dfba466ee4c05f4fd7829efc34e"
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
187936
x-amz-id-2
9GLx6lFQMKjIsq7JWn9GLzmmEGLqqi+ul1llqRvJqGs3r6AOBSAzJf5puQVfJrTGwhkE5jQASV8=
expires
Sat, 12 Oct 2019 21:55:46 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame 1812
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:293::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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

x-amz-id-2
kGI/LkmsIcd2daPyZ44T91Tgh3nqFBaPCP2I5Rt/ZLlg5M5DrVepYy/Ac/ZfkFjnOAPn7svobKA=
x-amz-request-id
B87A212102411FA1
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
Sat, 12 Oct 2019 21:50:46 GMT
Date
Sat, 12 Oct 2019 21:45:46 GMT
Connection
keep-alive
wigo-no-slot
sync.teads.tv/ Frame 640C
0
0
Document
General
Full URL
https://sync.teads.tv/wigo-no-slot
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
/wigo-no-slot
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=72ce4152-b66c-4041-b0ac-36aa320c629c
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
325
expires
Sat, 12 Oct 2019 21:45:46 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Sat, 12 Oct 2019 21:45:46 GMT
p2
sb.scorecardresearch.com/
Redirect Chain
  • 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=1570916746846&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?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=1570916746846&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?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=1570916746846&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=01758982&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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

Redirect headers

Location
https://sb.scorecardresearch.com/p2?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=1570916746846&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=01758982&cs_ucfr=1
Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:46 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1570916746844&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=129
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 12 Oct 2019 21:45:46 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=1570916746844&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=129
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 12 Oct 2019 21:45:46 GMT
content-length
23
content-type
image/gif
p2
sb.scorecardresearch.com/
Redirect Chain
  • 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=1570916746861&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?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=1570916746861&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?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=1570916746861&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=92649997&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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

Redirect headers

Location
https://sb.scorecardresearch.com/p2?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=1570916746861&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=92649997&cs_ucfr=1
Pragma
no-cache
Date
Sat, 12 Oct 2019 21:45:46 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1570916746859&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=129
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 12 Oct 2019 21:45:46 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=noSlot-minimum&ts=1570916746859&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=native&fv=129
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sat, 12 Oct 2019 21:45:46 GMT
content-length
23
content-type
image/gif
ad
a.teads.tv/page/68592/
86 B
302 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%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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=0482aab8-92ec-42b3-99c4-bd46df615f1a&formatVersion=2.22.61&env=js-web&netBw=9.2&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
2140372ece2cfab238453f838c69a30459f8f61958e106ae01b88e770f6e51f8

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:47 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
99
expires
Sat, 12 Oct 2019 21:45:47 GMT
b
sb.scorecardresearch.com/
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1570916746937&ns_c=UTF-8&cv=3.1e&c8=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:46 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
iframe
sync.teads.tv/ Frame 43AA
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=73584&userId=0482aab8-92ec-42b3-99c4-bd46df615f1a&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570916747080
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=73584&userId=0482aab8-92ec-42b3-99c4-bd46df615f1a&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570916747080
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=72ce4152-b66c-4041-b0ac-36aa320c629c
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
1694
expires
Sat, 12 Oct 2019 21:45:47 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Sat, 12 Oct 2019 21:45:47 GMT
set-cookie
tt_exelate=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None tt_skp=; Expires=Sun, 13 Oct 2019 21:45:47 GMT; Domain=.teads.tv; SameSite=None
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame AB24
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_256_GCM
Server
2.18.232.130 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Sun, 11 Oct 2020 21:45:48 GMT
Date
Sat, 12 Oct 2019 21:45:48 GMT
Connection
keep-alive
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 645F
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_256_GCM
Server
2.18.232.130 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Sun, 11 Oct 2020 21:45:48 GMT
Date
Sat, 12 Oct 2019 21:45:48 GMT
Connection
keep-alive
pd
eu-u.openx.net/w/1.0/ Frame 8BF4
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
i=387072fa-b105-0bc7-219d-2fe78c5bf8a9|1570916748
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
vary
Accept
set-cookie
i=387072fa-b105-0bc7-219d-2fe78c5bf8a9|1570916748; Version=1; Expires=Sun, 11-Oct-2020 21:45:48 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1570916748|mOgikimWiygu; Version=1; Expires=Sun, 27-Oct-2019 21:45:48 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Sat, 12 Oct 2019 21:45:48 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=387072fa-b105-0bc7-219d-2fe78c5bf8a9|1570916748; Version=1; Expires=Sun, 11-Oct-2020 21:45:48 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Sat, 12 Oct 2019 21:45:48 GMT
content-length
0
via
1.1 google
alt-svc
clear
index.html
cdn.districtm.io/ids/ Frame 7523
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
date
Sat, 12 Oct 2019 21:45:49 GMT
content-type
text/html
set-cookie
__cfduid=d4355ef6d25e75e424d707b26be17fb671570916748; expires=Sun, 11-Oct-20 21:45:48 GMT; path=/; domain=.districtm.io; HttpOnly
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
524c4350bcfdc837-AMS
content-encoding
br
usync.html
eus.rubiconproject.com/ Frame 0437
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
23.37.55.184 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-55-184.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

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
Wed, 09 Oct 2019 22:56:27 GMT
Content-Encoding
gzip
Content-Length
7650
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=85820
Expires
Sun, 13 Oct 2019 21:36:09 GMT
Date
Sat, 12 Oct 2019 21:45:49 GMT
Connection
keep-alive
Vary
Accept-Encoding
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?/RDYZFJOBALlnFDUkzFnBPWCAAAAAAABwNjAPAAAFAAwNjTbosAPAAAJPAWEABbosAZBAAOA55A55A85B55A58E55A55AGAx0A0yA0wArbosAPWCAJPAWEAHbosASksFhFjAAAAAAAAAAAAEAAAwNjAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA0xAy0A14A53AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A22A3xA52A11AJAylFj0FhuFnsFlBFKA03A22A3xA52A11AKA03A22A3xA52A11AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFckOwSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sat, 12-Oct-19 21:45:48 GMT
4765983595
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
297 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4765983595
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
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:49 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/4765983595
Transfer-Encoding
chunked
Content-Type
application/json
4766719655
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
297 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4766719655
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
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:50 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/4766719655
Transfer-Encoding
chunked
Content-Type
application/json
/
track.adform.net/Serving/Cookie/
73 B
448 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.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.23 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:52 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
180
expires
-1
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
14 KB
14 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
72278c01a98d7be689ae87722964b00ad0351e8b2b8673d32e16d18a771c0776

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:52 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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 3ccfbae98f5816b531634c1e82e45259.cloudfront.net (CloudFront), 1.1 varnish
age
2453916
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-fra19129-FRA
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1570916752.487064,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
Vs4TubaGEnCgigh3kN5-OJytJd-a8QzTxQCNFZg0hh5KVFK_O_tI7g==
x-cache-hits
635902
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 f96185b1d69d6f85635bc2b5554da639.cloudfront.net (CloudFront), 1.1 varnish
age
2408879
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5174
x-served-by
cache-fra19129-FRA
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1570916752.489010,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
uhaJsUkg4hXF1IiWZjxakv-aTXNBKcYYS7Jfn2_5QjDWGhm5qnKWew==
x-cache-hits
604840
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 80c1ad5f9352d00b95a9da73eb6b6be5.cloudfront.net (CloudFront), 1.1 varnish
age
835752
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-fra19129-FRA
last-modified
Thu, 03 Oct 2019 05:35:49 GMT
server
AmazonS3
x-timer
S1570916753.504782,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
FRA50-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
0zIezClPSKujQNINTjkBkI4aXGRPBea_0cpWlAdLjW-RysZcsgtNGw==
x-cache-hits
801950
sync
match.taboola.com/ Frame A3B9
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
401
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:45:52 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916753.512867,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=V7hWACFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMdwtNoPFYDAY7mZD6CjmgjMcETccCmcz2G1Gi-FssZkNB4vJcjeYQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPL7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAJcdEmA1Hl92gcNgNIpfdIHla7f4AAHgIAAEAGFAgARjAaSoBqMg5OAEAAAAAAAAAYPn___-PAdAjPpMByFAa7AF48AF4ICpYLWIEAAAA0MYe5Xg0qRMqiyoAAIJ0K4ArAICAtuD3ofswAAAAgrEFelj8frPDrvG7XQYAAAAAAAAAYPZ_9o8mBOV3lwZEGZSo9gsIALD2CwgAwKZuAABvAXBBR9CKwWB1BjHZjHaT2QEAAADc_f___-uB3MJhc2wsnpVrY1k5V46NazQybCamycI3sthmM-_VxDkJGooBP_SNCMvs9x0UlNPTY3YZZCyXyaAWyJoml98gPmgYlpNBML8JW4xWk8lmOZwtF5PBcDQcjfYncKMBTtBwOFjsBovdYjGcLCajwXKwQIEYTHBChqPNZDXarXaT5XAyGs02kw1StGo1G20Gw9VsMtvtVsPBcDkaIUVrFrPJZDEbLXebwXIyGgwnwyHC1GhlcQwGq7VwMzKsRZPZZK1cbkxrwWQw2Y0Mw5ln4liLXh_TaTnx2AzLLQoGVO1FcJFONKfL3-WyvDVvi1vn9DksYonmZJFOZJd9b-GwOTYWz8q1saycK8fGNRoZNhPTZOEbWWyzmb81Wlkcg8FqLdyMDGvRZDZZK5cb01owGUx2I8Nw5pk41qLXx3RaTjw2w3LfWO0Gy8VsN1rtG6vdYLmY7UarfYfO8F19zkblTavwCP3e7MnvmDkNCpfB4v0dLdLYrTczqqxji0U18Y1WRr_f7_f7_X6_3-83aD0Hs8GgiCWC00U6Eb2Mp4tYInlapBPVaGaY-CbD1cK1MG48htnEMlk4lsPFYDMyGZeriViiNF2kE73uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPLblH_0SEGy7lkM5sLF3PFaLJKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrqbiPfSlv32vFrc-DHEnC5_l8vy1rwtbp3T57AygMROAQ!&cmcv=&pix=31589837&cb=1570916752473&uv=231412&tms=1570916752473&abt=expl_vB!pqs1_vB!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1570916743884.6333!ts:1570916752473&
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916753.514239,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN
st
convammp.taboola.com/
0
120 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7hWACFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMdwtNoPFYDAY7mZD6CjmgjMcETccCmcz2G1Gi-FssZkNB4vJcjeYQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPL7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAJcdEmA1Hl92gcNgNIpfdIHla7f4AAHgIAAEAGFAgARjAaSoBqMg5OAEAAAAAAAAAYPn___-PAdAjPpMByFAa7AF48AF4ICpYLWIEAAAA0MYe5Xg0qRMqiyoAAIJ0K4ArAICAtuD3ofswAAAAgrEFelj8frPDrvG7XQYAAAAAAAAAYPZ_9o8mBOV3lwZEGZSo9gsIALD2CwgAwKZuAABvAXBBR9CKwWB1BjHZjHaT2QEAAADc_f___-uB3MJhc2wsnpVrY1k5V46NazQybCamycI3sthmM-_VxDkJGooBP_SNCMvs9x0UlNPTY3YZZCyXyaAWyJoml98gPmgYlpNBML8JW4xWk8lmOZwtF5PBcDQcjfYncKMBTtBwOFjsBovdYjGcLCajwXKwQIEYTHBChqPNZDXarXaT5XAyGs02kw1StGo1G20Gw9VsMtvtVsPBcDkaIUVrFrPJZDEbLXebwXIyGgwnwyHC1GhlcQwGq7VwMzKsRZPZZK1cbkxrwWQw2Y0Mw5ln4liLXh_TaTnx2AzLLQoGVO1FcJFONKfL3-WyvDVvi1vn9DksYonmZJFOZJd9b-GwOTYWz8q1saycK8fGNRoZNhPTZOEbWWyzmb81Wlkcg8FqLdyMDGvRZDZZK5cb01owGUx2I8Nw5pk41qLXx3RaTjw2w3LfWO0Gy8VsN1rtG6vdYLmY7UarfYfO8F19zkblTavwCP3e7MnvmDkNCpfB4v0dLdLYrTczqqxji0U18Y1WRr_f7_f7_X6_3-83aD0Hs8GgiCWC00U6Eb2Mp4tYInlapBPVaGaY-CbD1cK1MG48htnEMlk4lsPFYDMyGZeriViiNF2kE73uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPLblH_0SEGy7lkM5sLF3PFaLJKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrqbiPfSlv32vFrc-DHEnC5_l8vy1rwtbp3T57AygMROAQ!&cmcv=&pix=&cb=1570916752494&uv=231412&tms=1570916752494&abt=expl_vB!pqs1_vB!ufm_vE&ft=0&unm=FEED_MANAGER
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916753.514147,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN
tr
www.facebook.com/
44 B
249 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8083: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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 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
Sat, 12 Oct 2019 21:45:52 GMT
63bf0a60-a60f-41f9-bc6a-166897fce589
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/63bf0a60-a60f-41f9-bc6a-166897fce589
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
17fbdc56-19de-4e13-97ec-a0feafc6d52b
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/17fbdc56-19de-4e13-97ec-a0feafc6d52b
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.1adb3164d8c7900545faf5b4b02056fe.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:52 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=08220041
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.103 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Sat, 12 Oct 2019 21:50:52 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.1adb3164d8c7900545faf5b4b02056fe.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.29 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn4.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 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
Fri, 18 Oct 2019 21:59:00 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.1adb3164d8c7900545faf5b4b02056fe.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:53 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=70162529&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:53 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
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%2F&contentPieceId=2762702&publishDate=2016-05-25T18%3A31%3A03%2B02%3A00&_=1570916752527.2066712749
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 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
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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 479d15a99f4dd073131fba1516541469.cloudfront.net (CloudFront), 1.1 varnish
age
835751
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-fra19129-FRA
last-modified
Thu, 03 Oct 2019 05:35:49 GMT
server
AmazonS3
x-timer
S1570916753.588256,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
FRA50-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
RcDJpiZPf_GvMkZNZbmBvwGU1hbOSx8VeWPxdozaIEOgW2GV0CWAPw==
x-cache-hits
676883
dsm.js
vidstat.taboola.com/vpaid/ds/176/
1 KB
747 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.14.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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 71dbd5706c5b0c7b733248e1171f2d4f.cloudfront.net (CloudFront), 1.1 varnish
age
1338804
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
499
x-served-by
cache-fra19129-FRA
last-modified
Mon, 29 Jul 2019 13:39:31 GMT
server
AmazonS3
x-timer
S1570916753.591060,VS0,VE0
etag
"d2ab13c0468acb5251b93e254b36f876"
vary
Accept-Encoding
content-type
application/octet-stream
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
x-amz-cf-id
5bubRKzAzdJ6mdQCrNRW2D5xRVyIa8HqnM7MtVGBjfGulihsYyQsfw==
x-cache-hits
746558
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=V7hWACFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMdwtNoPFYDAY7mZD6CjmgjMcETccCmcz2G1Gi-FssZkNB4vJcjeYQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPL7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAJcdEmA1Hl92gcNgNIpfdIHla7f4AAHgIAAEAGFAgARjAaSoBqMg5OAEAAAAAAAAAYPn___-PAdAjPpMByFAa7AF48AF4ICpYLWIEAAAA0MYe5Xg0qRMqiyoAAIJ0K4ArAICAtuD3ofswAAAAgrEFelj8frPDrvG7XQYAAAAAAAAAYPZ_9o8mBOV3lwZEGZSo9gsIALD2CwgAwKZuAABvAXBBR9CKwWB1BjHZjHaT2QEAAADc_f___-uB3MJhc2wsnpVrY1k5V46NazQybCamycI3sthmM-_VxDkJGooBP_SNCMvs9x0UlNPTY3YZZCyXyaAWyJoml98gPmgYlpNBML8JW4xWk8lmOZwtF5PBcDQcjfYncKMBTtBwOFjsBovdYjGcLCajwXKwQIEYTHBChqPNZDXarXaT5XAyGs02kw1StGo1G20Gw9VsMtvtVsPBcDkaIUVrFrPJZDEbLXebwXIyGgwnwyHC1GhlcQwGq7VwMzKsRZPZZK1cbkxrwWQw2Y0Mw5ln4liLXh_TaTnx2AzLLQoGVO1FcJFONKfL3-WyvDVvi1vn9DksYonmZJFOZJd9b-GwOTYWz8q1saycK8fGNRoZNhPTZOEbWWyzmb81Wlkcg8FqLdyMDGvRZDZZK5cb01owGUx2I8Nw5pk41qLXx3RaTjw2w3LfWO0Gy8VsN1rtG6vdYLmY7UarfYfO8F19zkblTavwCP3e7MnvmDkNCpfB4v0dLdLYrTczqqxji0U18Y1WRr_f7_f7_X6_3-83aD0Hs8GgiCWC00U6Eb2Mp4tYInlapBPVaGaY-CbD1cK1MG48htnEMlk4lsPFYDMyGZeriViiNF2kE73uZXEYDp-_4OE8PMx-zeHlcTrMnr_g4Tw8zG6h33R22l1uretuctk9L8vt6XG5BS_LW_Qyu2x-u1tlubycHqPLblH_0SEGy7lkM5sLF3PFaLJKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrqbiPfSlv32vFrc-DHEnC5_l8vy1rwtbp3T57AygMROAQ!&cmcv=&uv=231412&unm=FEED_MANAGER&cb=1570916752572&abt=expl_vB!pqs1_vB!ufm_vE&baseReportD=taboola.com&dataCenter=am&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:52 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570916753.594454,VS0,VE16
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4044-HHN
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
89.163.159.123 Cloppenburg, 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:52 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:200c:ea00: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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
1506103
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
content-type
application/javascript; charset=utf-8
x-amz-cf-id
ByBMUN31l81yILgMT30blZnTQA5ojNm4hjIGS9Pp9faA1sVCKxvJXA==
via
1.1 bd785324d865b594e6f1838b58cb0dae.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal%20Hotline%3A%20Kundenservice%20per%20Telefon%20erreichen&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-hotline-kundenservice-per-telefon-erreichen%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=2ed5fc200b5d894b3c223bc281540bb7&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=801853479335
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
1aa6596b7c28d4bded7cf749842369593c1ae7b693887bf0abe0b3f84302f594

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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, 12 Oct 2019 21:45:53 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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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 1E3C
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBib-WDR0BsbsWsUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4206507991164553106
42 B
659 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4206507991164553106
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:54 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
Sat, 12 Oct 2019 21:45:54 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=4206507991164553106
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 C2C9
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Sat, 12 Oct 2019 21:45:54 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1570916754407&__it=-120&__ic=727391&__iq=3e863c04a9617b80931b9977735bd0cc&__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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:54 GMT
Last-Modified
Sun, 04 Oct 2009 21:45:36 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
Sat, 06 Oct 2012 21:45:36 GMT
usersync
uss.xplosion.de/
42 B
659 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=2ed5fc200b5d894b3c223bc281540bb7
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
User-Agent
Mozilla/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
Sat, 12 Oct 2019 21:45:54 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"
sync
match.taboola.com/ Frame 9470
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=76a47e8d-d4fc-47fa-97f3-f4185170234e-tuct49bcf10
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
401
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:45:54 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916755.513407,VS0,VE9
sync
match.taboola.com/ Frame FD06
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=76a47e8d-d4fc-47fa-97f3-f4185170234e-tuct49bcf10
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
403
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:45:56 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916757.515542,VS0,VE9
sync
match.taboola.com/ Frame 7455
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=76a47e8d-d4fc-47fa-97f3-f4185170234e-tuct49bcf10
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
401
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:45:58 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916759.516612,VS0,VE9
sync
match.taboola.com/ Frame 28D6
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=76a47e8d-d4fc-47fa-97f3-f4185170234e-tuct49bcf10
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:46:00 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916761.517847,VS0,VE9
sync
match.taboola.com/ Frame 5F3B
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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=V7ARECFgMCsUlKhKJsZwQCsUlKhKJsZwUAAAAGBvQHHcVccIYj4oZD4WwGu81oMZwtNrPhYDFZ7gZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3yh6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZ_XIAAAAAeABQKuyH-AEEAIgAAAAAkAAAAACgCKj4txC4AAAAAMAAKMD60QCg5JgIs-HoshsUDrtB5LIbJE-r3R8AAA8BIAAAAwokAAM4TSUAFTkHJwAAAAAAAAAALP____8xAHrEZzIAGUqDNwY9AA8-AA9CAAAAWUMeNFS2qshN_UQFq0WMAAAAANrYoxyPJnVCZVEFAECQbgVwBQAQ0Bb8PnSfpTso8RYGAABAMLZAD4vfb3bYNX63ywAAAAAAAAAAzP7P_tGEoPzu0oAogxLVfgEBANZ-AQEA2NQNAOAtAC7oCFoxGKzOICab0W4yOwAAAIC7____fz2QWzhsjo3Fs3JtLCvnyrFxjUaGzcQ0WfhGFtts5r2aOCdBQzHgh74RYZn9voOCcnp6zC6DjOUyGdQCWdPk8hvEBw3DcjII5jdhi9FqMtksh7PlYjIYjoaj0f4EbjTACRoOB4vdYLFbLIaTxWQ0WA4WKBCDCU7IcLSZrEa71W6yHE5Go9lmskGKVq1mo81guJpNZrvdajgYLkcjpGjNYjaZLGaj5W4zWE5Gg-FkOESYGq0sjsFgtRZuRoa1aDKbrJXLjWktmAwmu5FhOPNMHGvR62M6LScem2G5RcGAqr0ILtKJ5nT5u1yWt-ZtceucPodFLNGcLNKJ7LLvLRw2x8biWbk2lpVz5di4RiPDZmKaLHwji20287dGK4tjMFithZuRYS2azCZr5XJjWgsmg8luZBjOPBPHWvT6mE7LicdmWO4bq91guZjtRqt9Y7UbLBez3Wi179AZvqvP2ai8aRUeod-bPfkdM6dB4TJYvL-jRRq79WZGlXVssagmvtHK6Pf7_X6_3-_3-_0GredgNhgUsURwukgnopfxdBFLJE-LdKIazQwT32S4WrgWxo3HMJtYJgvHcrgYbEYm43I1EUuUpot0ote9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2S30m85Ou8utdd1NLrvnZbk9PS634GV5i15ml81vd6ssl5fTY3TZLeo_OsRgOZdsZnPhYq4YTVYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcT8V7ast-eV4sbP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/
accept-encoding
gzip, deflate, br
cookie
t_gid=76a47e8d-d4fc-47fa-97f3-f4185170234e-tuct49bcf10
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/specials/paypal-hotline-kundenservice-per-telefon-erreichen/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
403
accept-ranges
bytes
date
Sat, 12 Oct 2019 21:46:02 GMT
via
1.1 varnish
x-served-by
cache-hhn4044-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570916763.639379,VS0,VE9

Failed requests

These URLs were requested, but there was no response received. You will also see them in the list above.

Domain
adx.adform.net
URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPWI2ZDI0MWVhLWQzNTYtNGJhOS1hODlhLTE0YTkzZDVkYjE1Ng%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPWIwY2ZmNGFhLTkzNTQtNDU0MC1hNzQxLTBiODE1Y2JkMWFlYg%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPWVkMTYzNmNjLWQ2NjEtNDcxOC05NjNiLWEwYzg5ZjM3MTc4Mw%3D%3D&pt=gross&stid=5d12e48f-378f-472e-bf07-78efe2364a18&fd=1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
dmx.districtm.io
URL
https://dmx.districtm.io/b/v1

Verdicts & Comments Add Verdict or Comment

319 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| _absconfig object| smbVideoService object| pagespeed object| iam_data object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer 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| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| google_tag_manager object| nativendo_588f272a3e49c_conf object| google_optimize boolean| apstagLOADED function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired function| setImmediate function| clearImmediate function| _ object| _taboola object| closure_memoize_cache_ object| _econa function| send function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb string| preloadType object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk function| $ function| jQuery function| isEmpty object| gapi object| ___jsl object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq boolean| google_noFetch object| stroeerCore object| confiant object| TRC object| _tblConsole undefined| msg object| _comscore function| webpackJsonpdkuim object| Base64 boolean| dkuimInited function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet function| Goog_AdSense_OsdAdapter string| sdm_ift 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 number| _m6rApiLoaded object| nativendo_588f272a3e49c_map object| trcManager object| trcRbox object| options function| stroeerCoreConnect object| cmTag function| startCMTagMain object| teadsscript object| teads function| udm_ object| ns_p object| COMSCORE 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 object| Adform string| vpaidId function| OvaMediaPlayer 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

5 Cookies

Domain/Path Name / Value
.openx.net/ Name: i
Value: 6d53ffd2-7206-4e9c-a6a7-f1f0d643a307|1570916751
.ih.adscale.de/ Name: tu
Value: 4#3037761256#63~XaJJiLlQJs4AABf1JW8AAAAP&1118~436365~0~0
.adscale.de/ Name: uu
Value: 86f303b7ae1b4dc4b4c0ef61c7bad0f3
.agkn.com/ Name: ab
Value: 0001%3AqsUrO6NLlSbZ3FAxaFUuRk2QuEbp7KlqHcXJu2ftvkfbg5%2BAmJbI6g%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlNQYQJTUGEAAAAAAAAg1RAQCADVIBAIA

5 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.1adb3164d8c7900545faf5b4b02056fe.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.1adb3164d8c7900545faf5b4b02056fe.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
a.twiago.com
aax-eu.amazon-adsystem.com
acdn.adnxs.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
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
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
lb33.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
native.adscale.de
nugmw.userreport.com
orbidder.otto.de
pagead2.googlesyndication.com
pixel.rubiconproject.com
prg.smartadserver.com
px.powerlinks.com
rtb.mfadsrvr.com
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
ssl.3.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.gstatic.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
adx.adform.net
dmx.districtm.io
orbidder.otto.de
prg.smartadserver.com
104.111.246.233
104.16.68.69
107.178.241.34
109.71.25.30
13.224.190.187
13.225.78.95
130.211.13.252
136.243.244.75
136.243.33.84
143.204.101.106
144.76.115.247
151.101.113.194
151.101.114.2
151.101.114.49
151.101.14.2
151.101.14.217
152.199.21.32
161.156.66.178
172.217.22.98
172.217.23.98
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.185.163.33
18.195.39.206
18.196.191.159
185.22.221.117
188.40.16.106
192.132.33.46
193.46.63.75
194.213.222.29
2.16.31.65
2.18.232.130
2.18.232.7
2.18.233.67
2.18.234.21
2.18.234.72
2001:4de0:ac19::1:b:1b
23.37.53.21
23.37.55.184
2600:9000:200c:ea00:1c:8c89:a300:93a1
2600:9000:20eb:400:15:efbc:e300:93a1
2600:9000:20eb:d600:12:6213:9cc0:93a1
2600:9000:21f3:ae00:1f:a1b:34c0:93a1
2606:4700:20::6819:ac0d
2a00:1450:4001:800::200e
2a00:1450:4001:809::2001
2a00:1450:4001:80b::200e
2a00:1450:4001:817::2003
2a00:1450:4001:817::200a
2a00:1450:4001:819::2002
2a00:1450:4001:81b::2002
2a00:1450:4001:821::2002
2a00:1450:4001:821::200a
2a02:26f0:6c00:280::5f76
2a02:26f0:6c00:293::2c92
2a03:2880:f11c:8083:face:b00c:0:25de
34.248.95.73
34.250.43.132
34.95.120.147
35.165.120.69
35.186.238.175
37.157.4.23
37.252.173.22
40.113.136.100
46.253.113.178
46.51.201.190
52.219.74.84
52.28.238.200
52.57.147.248
52.94.216.48
62.168.44.125
62.168.44.126
63.32.86.220
69.173.144.136
69.173.144.141
85.215.5.31
89.163.159.101
89.163.159.103
89.163.159.123
91.215.100.39
91.215.100.40
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
01bd64076f129e4393e7cc464ae93d4ab379bdd8b814e195b75711315ebc3b4c
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0a2a14c9cdb999da22b06a0e6001164a64701acb46d9fad27624ada79fd7824a
0b1b274870c91aa245eab6474f0ed59b9bf4ebf290eeb962f58d118d3f099313
0cae80c9382e2b3e8045ba09797fd66d1a65a936d70af2eed09897be81ea436e
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
128869a25131fc642133dda16f4e88b723e1623e20234a39d260a1f0267c518f
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
147adb52f82298920419532ac2940735722e4ec5b91fa7f1d35d807c89528b53
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1aa6596b7c28d4bded7cf749842369593c1ae7b693887bf0abe0b3f84302f594
1ac8db4f957de8de07235e60e6380fca8d8f77e8d26a2075c4349c3c6b9564ca
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
2140372ece2cfab238453f838c69a30459f8f61958e106ae01b88e770f6e51f8
218509e786cb5203e3d152a936ee6fe6d2887e7fbd9b76562145cd0c0703a25f
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760
25e733a1f613ecc38ec1328b523886d15b54ebb05755db0a653cef4bd00745e6
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
2fc5f9e40074811f5fc7bd34340fc9aeadee4166dba547b7d5daa42fafb79b08
30b069c3c96bfbf561108b6187f21f804fbbbc98752662e3b060d6547c6196fd
314132c557a177a63efb52318a95a7cfb91bb9f92a7076c73aec17cfc673ce8d
317eac9d7175a01e3771d4b139f816944438ec16aa5e018649e3d0994f918a12
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3cddc2e86e4eb1938c7839c370626f1d75ce9308959399c7956b5ea9c2a7d334
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
40fec556296582552c3898912b32fad93973e972ef0130d4a3b5421cdfda6259
432bef8563dce9f21227b55041045751e2817270d720acc579c2aabe68a5b5e3
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
45bd046c3bc2d6447cf86dc59b5837ce0026b4c3ec8acf8b4f801bc74a3ddf32
483b1cb9374fb978ee7ecdc91c24b79a7a19f92e862859d3edfa8d9185eff9ce
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4da0d48ee11ac72c8809a7968e119f79330ed6a86acd7393c2e8d1a061fb0dba
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
4f9a3ab1fb44278cb1ab0148d38cf2270ac083df68454ed2feae820f41b984c5
4fe7907b1a352b40ea8de18285ccee7436334b363de8869fff9d331c3c36ad6a
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
653c559f44c69ec074fc37d07ba335861fd6c9e4d61416e6918f59547748f1cc
67e5ce59ad3f3bbc0b7c49bccdc80be5877e9eb7aa4544cdf1070218ce48cf26
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69df5bdf7b488a77d32e21bb84221914831e0d22c03c835e6b78347336652935
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6b09ffd0535f755f0c617c421d81bb9d9b044b2a0936874c72e5bd7a1c486f05
6ba5586970a86597ecd6b18e44de96147f414bbdaccb111f56c59d6ae1d3bc6f
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6df5a2fc07e8b543b7428df746cf2d2b79fc5e44eaa58a7e193edca54f3acf4e
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859
70798af7cba7b5d19bb39d288ad489e45cc967669f09880404a1264bad478629
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
72278c01a98d7be689ae87722964b00ad0351e8b2b8673d32e16d18a771c0776
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
740952ffb17cd168010ff300d8256a5db33a7a26bf888167a7d009526db212fb
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76a2ae22fb29af4e5309d1ff863aa2de23a3b4e536fbbce206d94ba004dddc15
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7de21741ce6a04659dae2b7b58e85f029a666b71163d4322a0368886fd69d901
7ffab66a5a2a78de0d9c2e3855aa6e1b8a1885d22efd6b914906ad253c56d616
805abebb1c272c12cae2d0b4d42456fc034e15f2c454345731db0edc8102c2f6
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
85086fc4f6795d55a36288cf13d4bf2cd50371f6b83fbf465d2641e761563e27
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
896e5d83ee1b9064b100e896d41174d656e6cd3dcf6bfddbee224d11abe84d49
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8e7c9e395ea8854ef513bc67def97960993015fc3ec515d23dd812a417a02556
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
986e83022d081600ae5d4e4154e5bae3808e11ea3596b37637fa8247d76c0daf
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a35c9bf832062f67296398e68c7636b67ddb3b1b1912b68373c56e0f4054bfcb
a3a23fa4d25333336141f62f59238f18f7309fc1fd2603b90e8c7f1b4c3991b4
a3de5528c777975b4e0521ca4cacbebfe101eb4abc50b41e11d147f1f9c7e560
a3e244d62127c387d1fc002134fa39bc19254d9dc23e718741febe8205554f13
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afdd14fdfb324274dcb74a70f26c940d7292a9f3d208a95fb462097bb22177d5
b49ec2c919b994586df5f428d1382493ff8d9b72a34bb54981db36cef825a262
b7804abd1a4348718be6a4955955f35efd3b0f274935c2c49661ef4c547afc99
b952c120285949582588b6bee440fc289ff4f515bf493f4c439ec2db0c3976af
b9ff1458bf3b7fc93c0312feca098dc18a387d52f9ee4b59fd426eee59789809
bbbe5addb526c9ee100006ae80da668ced6db0fb9be01d39e6c74b285a48c63c
bc4b9e4ed5dedebf574bc02e6e19f6981b53371efb8f0d6b0a077568b2be1872
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bd9960206d3cb7074c02fdfdb46d64bcbb39f262686d573e6183162f7dc037fe
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c309bc825095be00ef1122606a0680b454f3388f76d44f4097508394faa230fd
c4952a581943acd781bb4f77eb38864175717296578a3c3cf7e863400f784e0e
c4c75a02887e62fe3f0d1147473736552b456be87ba770c10a0b876a5574f356
c7cf83b63518d1a4a3ac0f33d021b1e4fba1283ff559719e1c49844d17aebaf5
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d068320411435bdf9a1c20c6f8051f0275ccee85ddb2639f8cb4cfd32b66880d
d1920f97f83cb1f547ef06bcb9b6d79d0058cc9839f085e983e433c12174cc2e
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dcdc865207319f39f803b7d1694b6f5fbfe1cabd3db8b49d62a2fb5d54cc95b4
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e401c7e132d89c8041b8d89f728dc00af6c3ebb6560d16e51162ad7c0b34cf53
e58627ba6a7c51694a6c1691729fa1e43f90cb10169efbf446308a9b6bccd79e
e8206f84ec4286658bd3051a8a2ea6a95ec17d5b685142f703ead0a7d117b977
e85ba4d66717e8de5dcba1b5e0285ced20874b84f316ff3c0840277352b9c9ea
e992c8fd6b6e3f14e0b78ee949c8959604d84319d7baa589f33aa9f6fb353992
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ea95f0af562ea3e973bfa8a4e982cbde7419632c3fb74c9d2eed6a307d266518
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef95ce2969cec0d47b6ace1c44eeea2a69a1da135aba966c3e83621b5cf15c8c
f0b68b83fd47e1b4672a272a736e7285fced839c6c306a3f5500b168d1f70e11
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
fccbb630a1abe89586932db6cc687b1f4a6daee0fa7cf8e9b118f0f97e582629