Submitted URL: http://www.giga.de/
Effective URL: https://www.giga.de/
Submission: On November 29 via manual from IT

Summary

This website contacted 60 IPs in 7 countries across 46 domains to perform 143 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
1 13 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
3 188.40.16.106 24940 (HETZNER-AS)
8 178.19.70.100 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
1 2 2a03:2880:f11... 32934 (FACEBOOK)
3 2a00:1450:400... 15169 (GOOGLE)
2 52.222.171.40 16509 (AMAZON-02)
2 5 95.100.146.26 16625 (AKAMAI-AS)
2 10 104.89.16.215 16625 (AKAMAI-AS)
8 107.178.241.34 15169 (GOOGLE)
2 3 91.215.103.65 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
3 178.19.72.20 29551 (HGCOMP-ASN)
1 151.101.14.2 54113 (FASTLY)
1 12 172.217.22.34 15169 (GOOGLE)
1 13.225.78.101 16509 (AMAZON-02)
1 95.100.145.49 16625 (AKAMAI-AS)
1 1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
4 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
6 2a00:1450:400... 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 3.122.213.19 16509 (AMAZON-02)
5 136.243.4.81 24940 (HETZNER-AS)
1 2600:9000:21f... 16509 (AMAZON-02)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
1 143.204.101.90 16509 (AMAZON-02)
3 23.209.84.82 16625 (AKAMAI-AS)
2 151.101.13.194 54113 (FASTLY)
2 2a02:26f0:eb:... 20940 (AKAMAI-ASN1)
1 2 216.58.205.230 15169 (GOOGLE)
3 213.254.244.18 36062 (DOUBLE-VE...)
1 37.157.4.39 198622 (ADFORM)
1 52.19.202.254 16509 (AMAZON-02)
1 2a03:2880:f01... 32934 (FACEBOOK)
1 2 89.163.159.99 24961 (MYLOC-AS)
1 62.168.44.118 5588 (GTSCE GTS...)
4 34.252.231.90 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 34.95.76.218 15169 (GOOGLE)
1 89.163.159.125 24961 (MYLOC-AS)
1 2600:9000:215... 16509 (AMAZON-02)
1 13.224.196.116 16509 (AMAZON-02)
1 63.34.92.224 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 108.128.71.27 16509 (AMAZON-02)
3 52.57.208.4 16509 (AMAZON-02)
2 52.219.72.199 16509 (AMAZON-02)
3 143.204.101.52 16509 (AMAZON-02)
2 46.4.69.14 24940 (HETZNER-AS)
1 148.251.47.137 24940 (HETZNER-AS)
143 60
Apex Domain
Subdomains
Transfer
29 giga.de
www.giga.de
static.giga.de
teaser.giga.de
videos.giga.de
ssl.3.damoh.giga.de
ssl.1.damoh.giga.de
556 KB
15 doubleclick.net
securepubads.g.doubleclick.net
ad.doubleclick.net
ff.doubleclick.net
114 KB
12 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
55 KB
11 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
6 KB
6 doubleverify.com
cdn.doubleverify.com
cdn3.doubleverify.com
tps.doubleverify.com
tps20233.doubleverify.com
72 KB
5 meetrics.net
lb21.s400.meetrics.net
1 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 googletagservices.com
www.googletagservices.com
114 KB
4 adscale.de
ih.adscale.de
js.adscale.de
7 KB
4 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
855 B
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
89 KB
4 ioam.de
script.ioam.de
de.ioam.de
13 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
199 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 giga-abs.de
go.giga-abs.de
2 KB
3 google-analytics.com
www.google-analytics.com
18 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 pubstack.io
boot.pubstack.io
cdn.prod.pubstack.io
20 KB
2 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
2 fastly.net
confiant-integrations.global.ssl.fastly.net
24 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
123 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 amazon-adsystem.com
c.amazon-adsystem.com
29 KB
2 facebook.com
www.facebook.com
564 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 giga-video.de
files.giga-video.de
65 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
494 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 atdmt.com
cx.atdmt.com
405 B
1 adform.net
track.adform.net
448 B
1 stroeerdigital.de
templates.stroeerdigital.de
1 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 googlesyndication.com
tpc.googlesyndication.com
1 dkuim.de
dkuim.de
151 KB
1 google.com
adservice.google.com
171 B
1 google.de
adservice.google.de
171 B
1 dunkirkinception.com
www.dunkirkinception.com
434 B
1 nuggad.net
si.nuggad.net
536 B
1 mxcdn.net
s400.mxcdn.net
49 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 taboola.com
cdn.taboola.com
14 KB
1 gstatic.com
www.gstatic.com
158 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
143 46
Domain Requested by
13 www.giga.de 1 redirects www.giga.de
www.google-analytics.com
12 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
10 tracking.m6r.eu 2 redirects www.giga.de
tracking.m6r.eu
6 videos.giga.de www.giga.de
videos.giga.de
text
6 static.giga.de www.giga.de
5 lb21.s400.meetrics.net www.giga.de
4 t.nativendo.de c.nativendo.de
4 www.googletagservices.com securepubads.g.doubleclick.net
4 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
4 d.nativendo.de www.giga.de
c.nativendo.de
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
3 ih.adscale.de 1 redirects www.giga.de
js.adscale.de
3 go.giga-abs.de www.giga.de
3 de.ioam.de 2 redirects www.giga.de
3 www.google-analytics.com www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 ssl.3.damoh.giga.de text
2 tps20233.doubleverify.com cdn.doubleverify.com
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 ad.doubleclick.net 1 redirects www.giga.de
2 cdn.stroeerdigitalmedia.de js.stroeermediabrands.de
www.giga.de
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 cdn.doubleverify.com securepubads.g.doubleclick.net
www.giga.de
2 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
2 www.facebook.com 1 redirects www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 ssl.1.damoh.giga.de text
1 files.giga-video.de videos.giga.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 ff.doubleclick.net securepubads.g.doubleclick.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 sak.userreport.com nugmw.userreport.com
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.prod.pubstack.io boot.pubstack.io
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 js.adscale.de js.stroeermediabrands.de
1 cx.atdmt.com
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 tps.doubleverify.com cdn.doubleverify.com
1 cdn3.doubleverify.com cdn.doubleverify.com
1 templates.stroeerdigital.de js.stroeermediabrands.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 d.agkn.com js.agkn.com
1 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 ajax.googleapis.com www.giga.de
1 dkuim.de www.giga.de
1 adservice.google.com securepubads.g.doubleclick.net
1 adservice.google.de securepubads.g.doubleclick.net
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 cdn.taboola.com www.giga.de
1 teaser.giga.de www.giga.de
1 cdn.m6r.eu 1 redirects
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
143 71
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-11-13 -
2020-09-10
10 months 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
*.google.com
GTS CA 1O1
2019-11-05 -
2020-01-28
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-11-06 -
2020-02-04
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
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
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
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
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2019-11-17 -
2020-10-09
a year crt.sh
*.googleapis.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-04-02 -
2020-05-02
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
templates.stroeerdigital.de
Amazon
2019-06-26 -
2020-07-26
a year crt.sh
*.doubleverify.com
DigiCert ECC Secure Server CA
2019-01-22 -
2020-01-22
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.doubleclick.net
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.prod.pubstack.io
Amazon
2019-09-18 -
2020-10-18
a year crt.sh
*.atlassolutions.com
DigiCert SHA2 High Assurance Server CA
2019-10-28 -
2020-01-26
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
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
cdn.prod.pubstack.io
Let's Encrypt Authority X3
2019-11-19 -
2020-02-17
3 months 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
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2019-11-15 -
2022-02-13
2 years crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-10
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-10-16 -
2020-01-14
3 months crt.sh

This page contains 17 frames:

Primary Page: https://www.giga.de/
Frame ID: 0EDEF6E776B8722E91B7AF6450C72AF1
Requests: 105 HTTP requests in this frame

Frame: https://videos.giga.de/embed/415710348
Frame ID: A01321F5BCE94418488164E274CD9DC9
Requests: 18 HTTP requests in this frame

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

Frame: https://d.agkn.com/iframe/8613/?che=37974995&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%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: E4F80328E36DC7BB5B19622C225CB6F2
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssQj_hY-muiEolaqAU6AZaWBLUnAxOyCKYMkRc3BnlJlILrBOdbOsgPcYoOyEkJfB1oJUCaG6XeadSU8D2Qrgtcth8VymUyPjdsMMVQads2cj84cb9YZhJ_aFUNl0XRkw2Ug-I8i58vZKcyfw-vAzMIB2LbI903FKBUBXRtS1ZrjUz-wG4uWhY-qEQpe3fZyJmWM4fRk0VzdmAgSRvA_GnHaSAOWOsHRa2OnePrxLOAp8gxR6ako3RlHbag3C56WxZ6v5rO1o5iJ6UFIinH&sig=Cg0ArKJSzEaQcLKio0_-EAE&urlfix=1&adurl=
Frame ID: FF04ED9FAEE1345DEF49564D04029BFF
Requests: 3 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvEXzUbPcASqBbCl6MaZ4tZMO4d62wOYmFV6C3WGZhIPkAXmMzdaRa6zP4Xw9Hc3ENHYFFGONV2ePM-b2iUu-4JL9f2jm0BLm1UYwqF3sj5B6BmNONNLDBZMV929mzDGLe3E8bs3f_edvfooQhZvSnEKpW6qCS48FkePMdUAyVFbMWJWQbi0I7o9SqpJKiqLlgwOzdiflz-Fg-3JBbRCX9MhiWmzRWa9qpFRxToUitiJL5PXmbrnJnEVy7gQ6fgP1uZj2MXYuCow15Kjk6D&sig=Cg0ArKJSzP2s3qVoCi84EAE&urlfix=1&adurl=
Frame ID: A433604348FA04164837C673AB995B22
Requests: 2 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/2019_23162_001_Amazon770x250_2911/index.html?clickTag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvLa8WhW2IIrFMXVg3qkGw1wm3MzU-X_lUNC_kbmz6hwWRqEzAnLVUvye1QPsO3P5eHiGQ30KN8Vy1KyH2pJQD64MP_k7-_2rRSuqVkZf2AtZhCQErsbkPQKwyMkjNsKuEDaE61pRXFUBQnwcB4qQerHNfrGmZRWwDLC6EJxN3JyfqP0_5s8eJdu4EDYfZljIkPmuMaC88rBTKVNQSTkKHTqyUXa9fI-EX62w8D4AD2D42YxrV-IrDFgYYRHgVH3Ips8AoovRRu%2526sig%253DCg0ArKJSzBS0UrZjjtyjEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN1059923.2019304STRERDIGITALMEDI%2FB23498714.260328635%3Bdc_trk_aid%3D456389860%3Bdc_trk_cid%3D124647342%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D%0A
Frame ID: B6F41043C3A7FC9CB670DA8FA765F450
Requests: 1 HTTP requests in this frame

Frame: https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
Frame ID: F9F554D54B6012FDBBD895D7215A45FF
Requests: 1 HTTP requests in this frame

Frame: https://cdn.doubleverify.com/dv-measurements297.js
Frame ID: 1B8ECDCF41BE977B4A1C617FE5577D03
Requests: 4 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvM24WOilXwUuOIh_dABfNvjWbz-FgSbVtq_gmIVAIDyrJfLqi1xauc2kANI-aBKgkRsZEJ0bZmpwQ9Jhwv42mPT8xUUATrM6m6yzqOGMPdLYlPp2PU-Dlz4iZpLJgvudTcISGSqHc35FsqhE3ZnJgnabdv0g_RiLE2sHfKHtAqG79I7A736AzrbUWDeJ4NtvLEnM7gZdC9GE58IsmGlINoNFzbn8DmYthglUd67llUi3kDr9KszfOwEetPz-3EmkxbAzHtfhBScOyXwVB4&sig=Cg0ArKJSzLd-RXR0tXIbEAE&urlfix=1&adurl=
Frame ID: 7B8AD5117475E64541A932AC0D3D489F
Requests: 2 HTTP requests in this frame

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

Frame: https://cdn3.doubleverify.com/t2tv7.html
Frame ID: E0F1AEE31FB05EC9C697FF75AED51AF5
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?ssl=1&format=video
Frame ID: 9CC46C24C77CC72637C6319C398DD7DC
Requests: 1 HTTP requests in this frame

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

Frame: https://ff.doubleclick.net/tag/js/fetch_frame_2019111801.html
Frame ID: A0F9774A3D9EE6318DF44A12FA3695AA
Requests: 1 HTTP requests in this frame

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

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

Screenshot


Page URL History Show full URLs

  1. http://www.giga.de/ HTTP 301
    https://www.giga.de/ Page URL

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

Page Statistics

143
Requests

99 %
HTTPS

28 %
IPv6

46
Domains

71
Subdomains

60
IPs

7
Countries

1877 kB
Transfer

5098 kB
Size

21
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. http://www.giga.de/ HTTP 301
    https://www.giga.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 13
  • https://ssl-econa.met.vgwort.de/na/88a61797ead349848b785fbd677f9b19 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 17
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 19
  • https://de.ioam.de/tx.io?st=giga&cp=giga_home&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0016&i2=0016be785940a1b0f5de0f889&ep=1598364637&vr=415&id=sxnjyl&i3=0016be785940a1b0f5de0f889%3A1604832777637%3A1575024777637%3A.giga.de%3A1%3Agiga%3Agiga_home%3Anoevent%3A1575024777637&n1=4&dntt=0&lt=1575024777638&ev=&cs=rlsoa&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=giga_home&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0016&i2=0016be785940a1b0f5de0f889&ep=1598364637&vr=415&id=sxnjyl&i3=0016be785940a1b0f5de0f889%3A1604832777637%3A1575024777637%3A.giga.de%3A1%3Agiga%3Agiga_home%3Anoevent%3A1575024777637&n1=4&dntt=0&lt=1575024777638&ev=&cs=rlsoa&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+OTHER HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20OTHER&checkcookies=true
Request Chain 36
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 37
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
Request Chain 73
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=8e42fa81c29be05c5f7ce632548bc697&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D8e42fa81c29be05c5f7ce632548bc697%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=8e42fa81c29be05c5f7ce632548bc697&userId=adscale-user:c57614d842424517b105806913900d75
Request Chain 85
  • https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua= HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
Request Chain 93
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstBM4ALbLgmbWfcNVMpoYN3P2JT7PcOiBXrJ2rMBKTK2FhVLp8wez-CBjLyfB6incZHfgls9Tfh3g4LvcGPZCIv1uV4v0DmF09BLVUvL2N-phl-4klNdCJXrB2fMF1nlZ7mXCEcmCfBOp4TBh8bTbkq77404QLPYG1h-gkyWHMSCd4ieEp6ChspZUp4BNdFsS93wAwbP7k1AcZRkgf41HFLjTDy5KI4pMxiEX4CKcKMFQVa-CnwWXIL7vWF2t_si1QTBM8JQEPazpLnC4JY&sig=Cg0ArKJSzOQENyPmnDYrEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 104
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent HTTP 302
  • https://cx.atdmt.com/?c=9774098073060771722&f=AYw-Sx_Ksl6HYWGB07KNklA1NuXTMFxc4H4uKvGXu_za_aVWrTTvmFzDLIEu8X7eFqgFhC1aYeSiWXXR8UXxpb-d&id=1773162896260346&l=3&v=0
Request Chain 119
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWSfkWiRFEiRsESUkWsfABifABSfABSfABifABifABfrr&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=4210918948358867557

143 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/
Redirect Chain
  • http://www.giga.de/
  • https://www.giga.de/
211 KB
63 KB
Document
General
Full URL
https://www.giga.de/
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
0b2be83508587d5bc8714c5f635d33b518a3df13b16da58fd8e4c433a0639149

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/
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
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
sec-fetch-mode
navigate
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

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Fri, 29 Nov 2019 10:52:57 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip

Redirect headers

Content-length
0
Location
https://www.giga.de/
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/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:57 GMT
last-modified
Fri, 29 Nov 2019 09:43:21 GMT
server
nginx
accept-language
bytes
etag
"5de0e839-3c78"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15480
expires
Sat, 28 Nov 2020 10:52:57 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/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:57 GMT
last-modified
Fri, 29 Nov 2019 09:43:21 GMT
server
nginx
accept-language
bytes
etag
"5de0e839-3da8"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15784
expires
Sat, 28 Nov 2020 10:52:57 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/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:57 GMT
last-modified
Fri, 29 Nov 2019 09:43:21 GMT
server
nginx
accept-language
bytes
etag
"5de0e839-3e24"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15908
expires
Sat, 28 Nov 2020 10:52:57 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/
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

Referer
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

strict-transport-security
max-age=15768000
content-encoding
gzip
age
56862
x-cache
HIT
status
200
x-cache-hits
8592
content-length
6462
via
1.1 varnish
x-served-by
cache-fra19166-FRA
last-modified
Thu, 28 Nov 2019 19:05:15 GMT
server
Apache
x-timer
S1575024778.601485,VS0,VE0
date
Fri, 29 Nov 2019 10:52:57 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
expires
Fri, 29 Nov 2019 19:05:15 GMT
pre-ca49b27b98.js
www.giga.de/static-local/dist/assets/js/
33 KB
10 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-ca49b27b98.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
6dd3895f5ada4228659707ea320d4e24bc6552bc6cf3422fb47d9d346968c1eb

Request headers

Referer
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
Fri, 22 Nov 2019 13:59:11 GMT
content-encoding
gzip
x-original-content-length
33371
server
nginx
access-control-allow-origin
*
etag
W/"5dd7e972-825b"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
10416
expires
Sat, 21 Nov 2020 13:59:11 GMT
main-desktop-00600edd16.css
www.giga.de/static-local/dist/assets/css/
401 KB
53 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-00600edd16.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
f2627d56fad12cefb399d0578c9f3c4ad45eba9cd72cc173bc85c366a925a276

Request headers

Referer
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
Fri, 29 Nov 2019 09:44:29 GMT
content-encoding
gzip
x-original-content-length
410820
server
nginx
access-control-allow-origin
*
etag
W/"5de0e839-644c4"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
status
200
cache-control
max-age=31536000
content-length
53959
expires
Sat, 28 Nov 2020 09:44:29 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/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0016
Resource Hash
b07e3b49fda5c92931231c98eaf53f279523b7f0aafc074820ff3bad386ef134

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Nov 2019 10:52:57 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0016
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
Fri, 29 Nov 2019 12:52:57 GMT
metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
js.stroeermediabrands.de/
241 KB
59 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
5213cdacb0f7cb4d1e62a7968adf19303eb3fe7c43f9e53f9af148e62c51ae79

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
last-modified
Fri, 29 Nov 2019 10:07:15 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
Sat, 28 Nov 2020 10:52:57 GMT
trackcp.js
gocp.stroeermediabrands.de/
28 KB
11 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Content-Encoding
gzip
Last-Modified
Mon, 25 Nov 2019 06:47:33 GMT
ETag
"5ddb7905-6fa7"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Sat, 30 Nov 2019 10:52:57 GMT
black-friday-GettyImages-1178114626-rcm625x352.jpg
static.giga.de/wp-content/uploads/2019/11/
36 KB
36 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/11/black-friday-GettyImages-1178114626-rcm625x352.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
b4241bfaca95e8bcc8bd5cbee914cfc5426e99906f1f63bf85722edb3e03f1e7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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
Thu, 28 Nov 2019 16:59:45 GMT
x-content-type-options
nosniff
age
64392
filer-source
aac97ff9515d31ba6c8114ed3ef0ce094b354d2ab587d10fbc534db497830249
x-cache
HIT
status
200
accept-language
bytes
content-length
36496
x-xss-protection
1; mode=block
last-modified
Thu, 28 Nov 2019 16:59:45 GMT
server
nginx/1.10.3
filer-attr
W1s2MjUsMzUyXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 28 Dec 2019 16:59:45 GMT
samsung-galaxy-s10-android-10-oneui-2-q_giga-rcm300x169.jpg
static.giga.de/wp-content/uploads/2019/10/
11 KB
12 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/10/samsung-galaxy-s10-android-10-oneui-2-q_giga-rcm300x169.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
0ae97947e61f3cfbc533be423ba1bbd7080d5b17758fb5b09fb9de383daa31a7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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
Wed, 27 Nov 2019 21:11:14 GMT
x-content-type-options
nosniff
age
135703
filer-source
359ef8360686c480d00256c6c2230ab5e3b164ea46f581107942ac8bb260631c
x-cache
HIT
status
200
accept-language
bytes
content-length
11612
x-xss-protection
1; mode=block
last-modified
Tue, 26 Nov 2019 11:14:26 GMT
server
nginx/1.10.3
filer-attr
W1szMDAsMTY5XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 26 Dec 2019 11:14:26 GMT
1.gif
www.gstatic.com/psa/static/
53 B
158 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::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

Referer
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
Thu, 21 Nov 2019 17:46:43 GMT
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
666374
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
53
x-xss-protection
0
expires
Fri, 20 Nov 2020 17:46:43 GMT
pk92_playstation-plus-rcm300x169.jpg
static.giga.de/wp-content/uploads/2019/11/
8 KB
9 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/11/pk92_playstation-plus-rcm300x169.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
ed3c54809d4c4db85864c8abfe2779cdfbcdad2ce1a5ca6db98105e98ee8ae35
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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
Wed, 27 Nov 2019 16:36:56 GMT
x-content-type-options
nosniff
age
152161
filer-source
4400a96f14a99034659db1094711eb1f5d9aa3d606d1b88cfc6f167c143ea497
x-cache
HIT
status
200
accept-language
bytes
content-length
8419
x-xss-protection
1; mode=block
last-modified
Wed, 27 Nov 2019 16:36:56 GMT
server
nginx/1.10.3
filer-attr
W1szMDAsMTY5XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 27 Dec 2019 16:36:56 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/88a61797ead349848b785fbd677f9b19
  • 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/
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/
User-Agent
Mozilla/5.0 (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
Fri, 29 Nov 2019 10:52:58 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
Fri, 29 Nov 2019 10:52:57 GMT
Last-Modified
Fri, 29 Nov 2019 10:52:57 GMT
Server
s2.50.19
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
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
252 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/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183: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

Referer
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
Fri, 29 Nov 2019 10:52:57 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
alt-svc
h3-23=":443"; ma=3600
content-length
44
expires
Fri, 29 Nov 2019 10:52:57 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-ca49b27b98.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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

Referer
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

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
1160
date
Fri, 29 Nov 2019 10:33:37 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Fri, 29 Nov 2019 12:33:37 GMT
apstag.js
c.amazon-adsystem.com/aax2/
88 KB
26 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-ca49b27b98.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.171.40 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-171-40.fra54.r.cloudfront.net
Software
Server /
Resource Hash
1412d7245072504d1975da264074e475485b5bab1edab58938a536542a4f3dd5

Request headers

Referer
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
Thu, 28 Nov 2019 12:52:14 GMT
content-encoding
gzip
server
Server
age
79243
etag
f95fda3d4fe6103808d969fc52fa66db
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA54
accept-ranges
bytes
x-amz-cf-id
DqCKTBoGvm0D2E7O6Wpgmq7xlmgrbJedTLyx4z2Y7JBicr6KH7qKAw==
via
1.1 e3666efb6956ba7f03c75c3401b8c79e.cloudfront.net (CloudFront)
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Content-Encoding
gzip
Last-Modified
Thu, 28 Nov 2019 14:47:57 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:57 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Fri, 29 Nov 2019 10:52:57 GMT
init
d.nativendo.de/cds/delivery/
991 B
919 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
d9a75729ca40f061dff3a36b6dae2a1cc1d9ebc5d6d2f83ec08a89a982178c3c

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
last-modified
Fri, 29 Nov 2019 10:52:57 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
517
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=giga_home&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0016&i2=0016be785940a1b0f5de0f889&ep=1598364637&vr=415&id=sxnjy...
  • https://de.ioam.de/tx.io?st=giga&cp=giga_home&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0016&i2=0016be785940a1b0f5de0f889&ep=1598364637&vr=415&id=sxnjy...
  • 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/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 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
Sat, 30 Nov 2019 10:52:57 GMT

Redirect headers

Date
Fri, 29 Nov 2019 10:52:57 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
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
Fri, 29 Nov 2019 10:52:57 GMT
Server
nginx
Location
/blank.gif
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
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
Thu, 29 Nov 2018 10:52:57 GMT
7cfe79b6142f4400ca35074e18_AzQxN2ViNDQwMzcx_5391a0f1463210c3d69a518c54101ff6.png
teaser.giga.de/48/41/df/
15 KB
15 KB
Image
General
Full URL
https://teaser.giga.de/48/41/df/7cfe79b6142f4400ca35074e18_AzQxN2ViNDQwMzcx_5391a0f1463210c3d69a518c54101ff6.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
5246644be6089cd84b624b1a21bd706846595d40af34d13a9d43534bceaff106
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 25 Nov 2019 23:00:01 GMT
x-content-type-options
nosniff
age
301977
filer-source
5246644be6089cd84b624b1a21bd706846595d40af34d13a9d43534bceaff106
x-cache
HIT
status
200
accept-language
bytes
content-length
14903
x-xss-protection
1; mode=block
last-modified
Mon, 25 Nov 2019 13:56:22 GMT
server
nginx/1.10.3
filer-attr
W1syNTYwLDYwXSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/png
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 25 Dec 2019 23:00:01 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
10 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

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
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-00600edd16.css
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:57 GMT
last-modified
Fri, 29 Nov 2019 09:43:21 GMT
server
nginx
accept-language
bytes
etag
"5de0e839-265c"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
9820
expires
Sat, 28 Nov 2020 10:52:57 GMT
415710348
videos.giga.de/embed/ Frame A013
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/415710348
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
30558167fd1e13d3bf5f971ab8905491d9eceabfc2c40651e4665ea8e62541d7

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/415710348
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=0016be785940a1b0f5de0f889:1604832777637:1575024777637:.giga.de:2:giga:giga_home:noevent:1575024777637:lblhq5
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
Referer
https://www.giga.de/

Response headers

status
200
server
nginx/1.14.1
date
Fri, 29 Nov 2019 10:52:57 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
bg.jpg
www.giga.de/special/gutscheine/
10 KB
10 KB
Image
General
Full URL
https://www.giga.de/special/gutscheine/bg.jpg
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
e8c918d8ae1a508aa0589554736f8ebe1830ebb9b5a3469da8d46ed7ad229450

Request headers

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

Response headers

date
Thu, 28 Mar 2019 00:04:09 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-26e1"
access-control-allow-methods
GET
content-type
image/jpeg
status
200
cache-control
max-age=31536000
access-control-allow-origin
*
content-length
9953
expires
Fri, 27 Mar 2020 00:04:09 GMT
icons-sprite.png
www.giga.de/special/gutscheine/
14 KB
14 KB
Image
General
Full URL
https://www.giga.de/special/gutscheine/icons-sprite.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
1c70c2c2279a48f9ee6d62deb5f0f9c8ccfac78c9143dfcdcae7b4b570a440f0

Request headers

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

Response headers

date
Thu, 28 Mar 2019 00:04:09 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-37e2"
access-control-allow-methods
GET
content-type
image/png
status
200
cache-control
max-age=31536000
access-control-allow-origin
*
content-length
14306
expires
Fri, 27 Mar 2020 00:04:09 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=495612959&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2F&ul=en-us&de=UTF-8&dt=GIGA%20-%20Leidenschaft%20f%C3%BCr%20Technik%20und%20Games&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=1142472053&gjid=1935566421&cid=2066417258.1575024778&tid=UA-204785-4&_gid=1763856413.1575024778&_r=1&cd1=&cd5=2011-11-09T13%3A44%3A29%2B01%3A00&cg1=Startseite&cg2=484&cg3=04-2016&cd2=gruen&cd6=Startseite&cd8=website&cd3=&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=&cd42=legacy&cd10=Variante%20%22flexible%20header%22&z=1821221751
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
samsung-galaxy-s10plus-telefonieren-q_giga-rcm300x169.jpg
static.giga.de/wp-content/uploads/2019/02/
9 KB
10 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/02/samsung-galaxy-s10plus-telefonieren-q_giga-rcm300x169.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
e055bed894d6c01fc4aafb80c53922728a5dbf80d1b09ae1dc796433f757c369
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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
Fri, 29 Nov 2019 03:17:10 GMT
x-content-type-options
nosniff
age
27348
filer-source
31ae4a1c27b11b125c968dd59caede5d4b9aeeab26702531470534bbe6ba4101
x-cache
HIT
status
200
accept-language
bytes
content-length
9727
x-xss-protection
1; mode=block
last-modified
Sat, 16 Nov 2019 05:33:26 GMT
server
nginx/1.10.3
filer-attr
W1szMDAsMTY5XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 16 Dec 2019 05:33:26 GMT
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
52.222.171.40 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-171-40.fra54.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Thu, 28 Nov 2019 13:48:03 GMT
content-encoding
gzip
vary
Origin
age
75913
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 6e8dd39e00d9a5c1a31d69ffa2821a5e.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA54
x-amz-cf-id
ZLeZEJAObooGEUhPAhd7W1TjhKqof2IMHldgM-l8gS5hqk70HNjqDA==
tolino-vision-5-q_giga-DSC07550-rcm300x169.jpg
static.giga.de/wp-content/uploads/2019/10/
9 KB
9 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/10/tolino-vision-5-q_giga-DSC07550-rcm300x169.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
47086c8a936615260e00f2a6371ff2ca0105df1dc07ceaa892a12308667b6c9a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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
Tue, 26 Nov 2019 05:39:23 GMT
x-content-type-options
nosniff
age
278014
filer-source
9f17bdcc0a91261055ba4368922ce966e39d849fc9cd564fcd961a74019c14cd
x-cache
HIT
status
200
accept-language
bytes
content-length
8897
x-xss-protection
1; mode=block
last-modified
Sun, 24 Nov 2019 08:12:47 GMT
server
nginx/1.10.3
filer-attr
W1szMDAsMTY5XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Tue, 24 Dec 2019 08:12:47 GMT
Saturn-Logo-Berlin-q_giga-rcm300x169.jpg
static.giga.de/wp-content/uploads/2019/07/
14 KB
15 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/07/Saturn-Logo-Berlin-q_giga-rcm300x169.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
c96da1b2936da5850abf3281eb0e3b5eedf57a92ce7de42704d500d7a2a7ad6b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 25 Nov 2019 14:47:23 GMT
x-content-type-options
nosniff
age
331535
filer-source
46ba346b1bc8af71edfd2778bce4be94c37de556e68f204b9514e4a2a62967a5
x-cache
HIT
status
200
accept-language
bytes
content-length
14639
x-xss-protection
1; mode=block
last-modified
Thu, 31 Oct 2019 18:30:06 GMT
server
nginx/1.10.3
filer-attr
W1szMDAsMTY5XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 30 Nov 2019 18:30:06 GMT
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.9337231162689246
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
X-Content-Type-Options
nosniff
Last-Modified
Fri, 29 Nov 2019 10:52:57 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Sat, 30 Nov 2019 10:52:48 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame A125
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+OTHER
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20OTHER&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20OTHER&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/
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
Referer
https://www.giga.de/

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
Fri, 29 Nov 2019 10:52:57 GMT
Content-Length
1580
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=8e42fa81c29be05c5f7ce632548bc697; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Thu, 27 Feb 2020 10:52:57 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
296
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20OTHER&checkcookies=true
Date
Fri, 29 Nov 2019 10:52:57 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Fri, 29 Nov 2019 11:52:57 GMT
tfa.js
cdn.taboola.com/libtrc/unip/1092206/
42 KB
14 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/unip/1092206/tfa.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
466ad4346ce936aca54d8e30d30f4a3b6890280581344a35a2ec48cb787a2c40

Request headers

Referer
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

x-amz-version-id
.Sr6cGswuM06H1SOMJ9QGDOSbAZP_tRX
content-encoding
gzip
age
33
x-cache
HIT
status
200
date
Fri, 29 Nov 2019 10:52:57 GMT
x-amz-replication-status
COMPLETED
content-length
13755
x-amz-id-2
CfdaX6u04X7wUDW7cNFH7pSkbKvt8sP701spY0B8dWk9eZaqDSRXA/ydhe5EJLKIDOYLlsNC2bU=
x-served-by
cache-fra19134-FRA
last-modified
Tue, 26 Nov 2019 13:03:31 GMT
server
AmazonS3
x-timer
S1575024778.745091,VS0,VE0
etag
"4a8fab3f8b10fbee9d4529b12cfe5be0"
vary
Accept-Encoding
x-amz-request-id
1F3D337CF5CDFE27
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
51
x-cache-hits
5
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
15 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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
sffe /
Resource Hash
f39f343e54ceca709e31ef90afc42e5388bd34a8693ab98d15d65f7b1575d079
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"351 / 587 of 1000 / last-modified: 1574960877"
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15686
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:57 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
286 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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.101 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-101.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
d479ead5caf0180533e3533bd099c70218619589a7fae0e5ab7415c1e781aaea

Request headers

Referer
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
Fri, 29 Nov 2019 09:59:03 GMT
content-encoding
gzip
age
3233
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C2
access-control-allow-origin
*
x-amz-cf-id
RT3nCdbptOB_SLcny0KKIOCjM9R00W6-Xpm3zRXY-4zCHknvTyDk5g==
via
1.1 7158aa4ac648947d564b98d9769b5b2b.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.100.145.49 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-145-49.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 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
49772
Expires
Fri, 29 Nov 2019 12:52:57 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Fri, 29 Nov 2019 10:52:57 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/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
  • https://nugmw.userreport.com/rc-ap/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:1200:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
aebdd9a915b4ef4a02e8644990e22ac80caf8e0252db1a40b5879f628d64f6ff

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
via
1.1 009e5e3e32afcd1d135a7234c9da5521.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
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
1801
x-amz-cf-id
1s-g8arrfHUiH--CQ_SI-Fb0z4stal1bjSsirPb3dBb80HYPE9j08Q==

Redirect headers

date
Fri, 29 Nov 2019 10:52:57 GMT
via
1.1 edfd22ec6695cdc9d7ac634220af1315.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
location
https://nugmw.userreport.com/rc-ap/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
access-control-allow-methods
get, post, options
status
302
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
2_It-8m8FBvx3sxUnCs902GTwQ8WsOOF1-WmV0jjlwuQH-Z-in8x3Q==
ad-loading.gif
www.dunkirkinception.com/detect/
123 B
434 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagS/
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
8a639873531a8b6008faa79685ff27e35eff2e990b5906732b94716410aa96f3

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:52:57 GMT
ETag
W/"7b-s9+QuaJAxJSTLGhzIKVUmbbyHu0"
X-Powered-By
TSAdServer
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
123
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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:ae00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
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
Thu, 28 Nov 2019 17:46:13 GMT
via
1.1 c379418fd6100691807f32f274ebe9ce.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
62265
etag
"f53f55cbab099be3a970b446a66c496a"
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
NK1WqlaQiD9b7UyhtX0AzNR6tBNIldwH5SRUlFGhOZHo1NCHVN3MYA==
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
19 KB
19 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1575024777
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
aa930d29e912acca34c296dad4be163ebd7c6af142d902e9f8d50a1d963233cc

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

Access-Control-Allow-Origin
*
Date
Fri, 29 Nov 2019 10:52:57 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
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=1176
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::681a:5fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
via
1.1 google
cf-cache-status
HIT
age
850791
cf-polished
origSize=55238
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
53d408fdc8a1cbb0-VIE
expires
Wed, 18 Nov 2020 14:33:06 GMT
giga-772cc0e021.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-772cc0e021.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef

Request headers

Referer
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
Tue, 05 Nov 2019 09:50:15 GMT
content-encoding
gzip
x-original-content-length
31296
server
nginx
access-control-allow-origin
*
etag
W/"5dc14599-7a40"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
11732
expires
Wed, 04 Nov 2020 09:50:15 GMT
dmp
tracking.m6r.eu/sync/
108 B
607 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
eef4a15c3052aafe48e802c56cbe67a693f3492dd091bc83b75cb87cae857ae9

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:52:57 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
116
video-gallery-fff486d99c.js
www.giga.de/static-local/dist/assets/js/components/
782 B
688 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/video-gallery-fff486d99c.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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
0e838acd19fb2161149a1790c00a15758f89b7dde0270bfb9b76dfcdf38503a0

Request headers

Referer
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
Thu, 28 Mar 2019 00:03:21 GMT
content-encoding
gzip
x-original-content-length
782
server
nginx
accept-language
bytes
etag
"5c9a4313-30e"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
access-control-allow-origin
*
content-length
388
expires
Fri, 27 Mar 2020 00:03:21 GMT
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame A013
619 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/415710348
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
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-9aae0"
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 A013
273 KB
93 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/415710348
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5fa6833aaa4245a425c0bf047e200f7be29f46246239529a6e4ac8085736671d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:52:57 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
94888
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:57 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%2F&__id=1575024777863&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:57 GMT
Last-Modified
Sat, 21 Nov 2009 10:52:48 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
Fri, 23 Nov 2012 10:52:48 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: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::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

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::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

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
pubads_impl_2019111801.js
securepubads.g.doubleclick.net/gpt/
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
sffe /
Resource Hash
03b07f320a1692a2d507465027fffaa6560d19d248c33bb6a5f2c97b75680c1d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 18 Nov 2019 14:07:04 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59620
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:57 GMT
-480x60._UsJCX8.gif
www.giga.de/imagS/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagS/-480x60._UsJCX8.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
server
nginx
x-powered-by
TSAdServer
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
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame A013
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/415710348
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

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:52:57 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-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 A013
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/415710348
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

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:52:57 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
Thu, 27 Feb 2020 10:52:57 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/
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

Referer
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
Fri, 29 Nov 2019 10:52:57 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
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=GIGA%20-%20Leidenschaft%20f%C3%BCr%20Technik%20und%20Games&canonicalUrl=https%3A%2F%2Fwww.giga.de%2F&url=https%3A%2F%2Fwww.giga.de%2F&contentPieceId=484&publishDate=2016-04-04T17%3A22%3A17%2B02%3A00&_=1575024777935.-754674605
Requested by
Host: www.giga.de
URL: https://www.giga.de/
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

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Last-Modified
Mon, 25 Nov 2019 06:46:12 GMT
ETag
"5ddb78b4-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=89ceb345-90db-4a47-a654-84bb00b8ca2c&smb_sp=&smb_ch=gruen
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
aacfa0a8589dfcd298c605fc1751cdc9f6b809c2ab898aeb03c2ca8812e0a853

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:57 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1395
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/
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
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 22 Nov 2019 01:35:10 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
638267
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
Sat, 21 Nov 2020 01:35:10 GMT
ads
securepubads.g.doubleclick.net/gampad/
12 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1435091010415958&correlator=4195436988493638&output=ldjh&impl=fif&adsid=NT&eid=21065219%2C21062833%2C21063145&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191129&iu=4444%2Fgiga.de_sd%2Fhome_startseite&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dgruen%26smb-content%3DStartseite%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D3%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26mbrid%3D8e42fa81c29be05c5f7ce632548bc697%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%252Ca191967d%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575024777&dt=1575024777983&dlt=1575024777581&idt=365&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2474492366&uci=1&ifi=1&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2F&dssz=55&icsg=51573226112&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=2066417258.1575024778&ga_sid=1575024778&ga_hid=495612959&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
16849c854b667fd47bade33fd9ea96fbc8f0442aaba63488cd4db8198af2cacb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4748
x-xss-protection
0
google-lineitem-id
5231974248
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138295612011
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_2019111801.js
securepubads.g.doubleclick.net/gpt/
65 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
sffe /
Resource Hash
23f5a3eca6fec1f8380dd45a87da65ee9ab4c93d4602403dc26b18e2afeb201f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 18 Nov 2019 14:07:04 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25219
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:58 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
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

ads
securepubads.g.doubleclick.net/gampad/
9 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1435091010415958&correlator=4195436988493638&output=ldjh&impl=fif&adsid=NT&eid=21065219%2C21062833%2C21063145&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191129&iu=4444%2Fgiga.de_sd%2Fhome_startseite&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dgruen%26smb-content%3DStartseite%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D3%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26mbrid%3D8e42fa81c29be05c5f7ce632548bc697%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%252Ca191967d%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575024777&dt=1575024777996&dlt=1575024777581&idt=365&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3176545799&uci=2&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2F&dssz=56&icsg=2251851386911360&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=2066417258.1575024778&ga_sid=1575024778&ga_hid=495612959&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
01660e42aa0e71721c0c50e15188cf158060cb7f15c4a656bfec83831c88201a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3710
x-xss-protection
0
google-lineitem-id
5231974257
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138295146484
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/
9 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1435091010415958&correlator=4195436988493638&output=ldjh&impl=fif&adsid=NT&eid=21065219%2C21062833%2C21063145&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191129&iu=4444%2Fgiga.de_sd%2Fhome_startseite&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dgruen%26smb-content%3DStartseite%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D3%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26mbrid%3D8e42fa81c29be05c5f7ce632548bc697%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%252Ca191967d%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575024778&dt=1575024778010&dlt=1575024777581&idt=365&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3278712392&uci=3&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2F&dssz=56&icsg=2251851386911360&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=2066417258.1575024778&ga_sid=1575024778&ga_hid=495612959&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
5d5056a2f20fa890a19b411ba27b663c848b0298db4968030b3b9aae09577047
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3605
x-xss-protection
0
google-lineitem-id
4863977886
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138255086669
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/
383 B
285 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1435091010415958&correlator=4195436988493638&output=ldjh&impl=fif&adsid=NT&eid=21065219%2C21062833%2C21063145&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191129&iu=4444%2Fgiga.de_sd%2Fhome_startseite&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dgruen%26smb-content%3DStartseite%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D3%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26mbrid%3D8e42fa81c29be05c5f7ce632548bc697%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%252Ca191967d%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575024778&dt=1575024778015&dlt=1575024777581&idt=365&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3442698974&uci=4&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2F&dssz=56&icsg=2251851386911360&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=950x0&msz=800x450&ga_vid=2066417258.1575024778&ga_sid=1575024778&ga_hid=495612959&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
dc201720e1ce31148e4e5c66702ba5a5c56b66e245fae60306f1b1ca75369e2e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
200
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
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/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1435091010415958&correlator=4195436988493638&output=ldjh&impl=fif&adsid=NT&eid=21065219%2C21062833%2C21063145&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191129&iu=4444%2Fgiga.de_sd%2Fhome_startseite&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dgruen%26smb-content%3DStartseite%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D3%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26mbrid%3D8e42fa81c29be05c5f7ce632548bc697%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%252Ca191967d%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575024778&dt=1575024778022&dlt=1575024777581&idt=365&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2475195157&uci=5&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2F&dssz=56&icsg=2251851386911360&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=2066417258.1575024778&ga_sid=1575024778&ga_hid=495612959&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
ff844e8444ab91d7c856416a23357c452b5eccae2ab3f2bf533ea7eceeada2d3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1716
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
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
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
3.122.213.19 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-213-19.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/
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
Content-Type
text/plain

Response headers

date
Fri, 29 Nov 2019 10:52:58 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
submit
lb21.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb21.s400.meetrics.net/bb-mx/submit?/d+HTBQAAAzwhFo0F0wFz6BvvA33F3uBnpFnhFukElvBfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSa1BPAAAAAAAAAOAAAAGAAAAAAAZwSa1BBRksFAQtjFfy/tSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.81 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h229.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 29 Nov 2019 10:52:57 GMT
data
lb21.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb21.s400.meetrics.net/data?/d+HTCSAAATkzFARksFAQtjFypJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.81 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h229.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 29-Nov-19 10:52:57 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=1176
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
cf-cache-status
HIT
age
850792
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
53d408fefbe2cbb0-VIE
expires
Wed, 18 Nov 2020 14:33:06 GMT
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=2&d10=1&d2=2&d4=6&d11=3&d8=2&d9=1&d12=3&d1=1&d3=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
95.100.146.26 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-146-26.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 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
Fri, 29 Nov 2019 10:52:58 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=0&n121=1&n116=0&n104=0&n15=3&n155=1&n133=1&n106=1&n153=0&n11=2&n120=3&n154=1&n125=0&n8=1&n2=2&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=0&n60=1&n139=1&n160=0&n107=0&n21=1&n51=1&n117=4&n86=0&n147=3&n64=0&n119=1&n22=1&n18=1&n161=1&n126=1&n92=3&n77=0&n83=0&n102=1&n105=0&n159=1&n20=1&n80=0&n12=6&n141=0&n157=1&n99=1&n128=1&n118=1&n85=0&n9=3&n6=2&n63=0&n138=0&n140=0&n94=2&n111=1&n136=1&n79=1&n93=4&n90=1&n37=2&n55=1&n142=0&n7=1&n103=0&n158=1&n124=0&n75=1&n91=1&n114=1&n69=0&n10=3&n3=1&n82=0&n84=0&n5=3&n48=1&n109=0&n122=1&n67=2&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=0&n88=0&n39=1&n156=1&n148=1
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
0
Content-Type
text/javascript; charset=utf-8
/
d.agkn.com/iframe/8613/ Frame E4F8
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=37974995&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:7000:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=37974995&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%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
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/
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
Referer
https://www.giga.de/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
482
cache-control
no-cache, must-revalidate
date
Fri, 29 Nov 2019 10:52:58 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%3AF4e0BzY5daaYJzCODUkyy924VunjKBO7;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlc7UKJXO1CgAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
x-cache
Miss from cloudfront
via
1.1 a10d58b5ce965502cc34c5b27682fe23.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
HSFnqHrQ5GsH0-twabLLD_xWU6WTWKOQEqBDKT9ilegdb15RHPjGtQ==
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/
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

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
access-control-allow-origin
*
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
status
200
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=8e42fa81c29be05c5f7ce632548bc697&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D8e42fa81c29be05c5f7ce632548bc697%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=8e42fa81c29be05c5f7ce632548bc697&userId=adscale-user:c57614d842424517b105806913900d75
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=8e42fa81c29be05c5f7ce632548bc697&userId=adscale-user:c57614d842424517b105806913900d75
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=8e42fa81c29be05c5f7ce632548bc697&userId=adscale-user:c57614d842424517b105806913900d75
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Fri, 29 Nov 2019 10:52:58 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame FF04
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssQj_hY-muiEolaqAU6AZaWBLUnAxOyCKYMkRc3BnlJlILrBOdbOsgPcYoOyEkJfB1oJUCaG6XeadSU8D2Qrgtcth8VymUyPjdsMMVQads2cj84cb9YZhJ_aFUNl0XRkw2Ug-I8i58vZKcyfw-vAzMIB2LbI903FKBUBXRtS1ZrjUz-wG4uWhY-qEQpe3fZyJmWM4fRk0VzdmAgSRvA_GnHaSAOWOsHRa2OnePrxLOAp8gxR6ako3RlHbag3C56WxZ6v5rO1o5iJ6UFIinH&sig=Cg0ArKJSzEaQcLKio0_-EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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

timing-allow-origin
*
date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
[PROD]_BillboardExt.min.js
templates.stroeerdigital.de/
2 KB
1 KB
Script
General
Full URL
https://templates.stroeerdigital.de/[PROD]_BillboardExt.min.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.90 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-90.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
79ce82d4c778ade37fe234dacef1da7f0b510c5140bab394ed9faf6495c64c91

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:59 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 10:29:20 GMT
server
AmazonS3
x-amz-cf-pop
FRA50-C1
etag
"4d4ffe0edbd07b34f9bfb11e6696b713"
x-cache
RefreshHit from cloudfront
content-type
application/javascript; charset=UTF-8
status
200
cache-control
no-cache
accept-ranges
bytes
content-length
872
via
1.1 a09186728c1bcdf0a561aedd92656804.cloudfront.net (CloudFront)
x-amz-cf-id
FXWe-ELYrwQCMP0aA1aPN8erieaOgQzwkg_aAS-OPOdUAXprAeoVRw==
dvtp_src.js
cdn.doubleverify.com/ Frame FF04
18 KB
6 KB
Script
General
Full URL
https://cdn.doubleverify.com/dvtp_src.js?ctx=13817131&cmp=23498714&sid=5504146&plc=260328635&adsrv=1&btreg=&btadsrv=&crt=&tagtype=&dvtagver=6.1.src
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.209.84.82 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-209-84-82.deploy.static.akamaitechnologies.com
Software
Microsoft-IIS/10.0 /
Resource Hash
1400b120f0ab181fc389dfec74a7b3a6e470b379b2af0d0dd2efecba974f940e

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Last-Modified
Thu, 28 Nov 2019 07:49:11 GMT
Server
Microsoft-IIS/10.0
ETag
"80354752c0a5d51:0"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=66722
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5809
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame FF04
76 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_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
29138
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:58 GMT
osd.js
www.googletagservices.com/activeview/js/current/
78 KB
29 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_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0e946b0ee0337cf23c845f67a238e1fefd5f1e014fdbd8ea27870172fcedd40f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
29338
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:58 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame A433
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvEXzUbPcASqBbCl6MaZ4tZMO4d62wOYmFV6C3WGZhIPkAXmMzdaRa6zP4Xw9Hc3ENHYFFGONV2ePM-b2iUu-4JL9f2jm0BLm1UYwqF3sj5B6BmNONNLDBZMV929mzDGLe3E8bs3f_edvfooQhZvSnEKpW6qCS48FkePMdUAyVFbMWJWQbi0I7o9SqpJKiqLlgwOzdiflz-Fg-3JBbRCX9MhiWmzRWa9qpFRxToUitiJL5PXmbrnJnEVy7gQ6fgP1uZj2MXYuCow15Kjk6D&sig=Cg0ArKJSzP2s3qVoCi84EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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

timing-allow-origin
*
date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame A433
76 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_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
29138
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:58 GMT
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
50 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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8579026504b16f72bc28feaf090cf853f72bc22c7544bc31abbc41892f2e504c

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Age
615
X-Cache
HIT
Connection
keep-alive
Content-Length
12014
x-amz-id-2
yQJEmzcM1laP1Xa8T5ScitLxiF/8Grp2uthYt7t4f/EYcUA23BxP6n5wBR13nWN6UQst5MR5DSM=
X-Served-By
cache-fra19158-FRA
Last-Modified
Fri, 29 Nov 2019 10:17:30 GMT
Server
AmazonS3
X-Timer
S1575024778.237251,VS0,VE0
ETag
"472007036308abf9176622fba0713b5c"
x-amz-request-id
5D39A523226F611C
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
984
/
d.nativendo.de/cds/delivery/get/
10 KB
3 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
6136ebd39cee2065813b9b7ac99b696af62cbb7c36cb4b0dd1cfd829e32dc74c

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
last-modified
Fri, 29 Nov 2019 10:52:58 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
2283
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
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=495612959&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2F&ul=en-us&de=UTF-8&dt=GIGA%20-%20Leidenschaft%20f%C3%BCr%20Technik%20und%20Games&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=415710348%20--%20GIGA%20App-Tipp%3A%20Spiele-Apps%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=2066417258.1575024778&tid=UA-204785-4&_gid=1763856413.1575024778&cd1=&cd5=2011-11-09T13%3A44%3A29%2B01%3A00&cg1=Startseite&cg2=484&cg3=04-2016&cd2=gruen&cd6=Startseite&cd8=website&cd3=&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=&cd42=legacy&cd10=Variante%20%22flexible%20header%22&cd9=201908&cd11=415710348&cd12=SELF&cd13=493&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=1494226972
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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

Referer
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

pragma
no-cache
date
Thu, 21 Nov 2019 00:51:24 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
727294
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
index.html
cdn.stroeerdigitalmedia.de/Ads/2019_23162_001_Amazon770x250_2911/ Frame B6F4
0
0
Document
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/2019_23162_001_Amazon770x250_2911/index.html?clickTag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvLa8WhW2IIrFMXVg3qkGw1wm3MzU-X_lUNC_kbmz6hwWRqEzAnLVUvye1QPsO3P5eHiGQ30KN8Vy1KyH2pJQD64MP_k7-_2rRSuqVkZf2AtZhCQErsbkPQKwyMkjNsKuEDaE61pRXFUBQnwcB4qQerHNfrGmZRWwDLC6EJxN3JyfqP0_5s8eJdu4EDYfZljIkPmuMaC88rBTKVNQSTkKHTqyUXa9fI-EX62w8D4AD2D42YxrV-IrDFgYYRHgVH3Ips8AoovRRu%2526sig%253DCg0ArKJSzBS0UrZjjtyjEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN1059923.2019304STRERDIGITALMEDI%2FB23498714.260328635%3Bdc_trk_aid%3D456389860%3Bdc_trk_cid%3D124647342%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D%0A
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

:method
GET
:authority
cdn.stroeerdigitalmedia.de
:scheme
https
:path
/Ads/2019_23162_001_Amazon770x250_2911/index.html?clickTag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvLa8WhW2IIrFMXVg3qkGw1wm3MzU-X_lUNC_kbmz6hwWRqEzAnLVUvye1QPsO3P5eHiGQ30KN8Vy1KyH2pJQD64MP_k7-_2rRSuqVkZf2AtZhCQErsbkPQKwyMkjNsKuEDaE61pRXFUBQnwcB4qQerHNfrGmZRWwDLC6EJxN3JyfqP0_5s8eJdu4EDYfZljIkPmuMaC88rBTKVNQSTkKHTqyUXa9fI-EX62w8D4AD2D42YxrV-IrDFgYYRHgVH3Ips8AoovRRu%2526sig%253DCg0ArKJSzBS0UrZjjtyjEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN1059923.2019304STRERDIGITALMEDI%2FB23498714.260328635%3Bdc_trk_aid%3D456389860%3Bdc_trk_cid%3D124647342%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D%0A
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/
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
Referer
https://www.giga.de/

Response headers

status
200
server
Apache
etag
"e692601abd6b9d4ae23bfadc1349aeff:1574760341"
last-modified
Tue, 26 Nov 2019 09:25:41 GMT
accept-ranges
bytes
content-type
text/html
vary
Accept-Encoding
content-encoding
gzip
cache-control
max-age=86400
expires
Sat, 30 Nov 2019 10:52:58 GMT
date
Fri, 29 Nov 2019 10:52:58 GMT
content-length
998
access-control-max-age
86400
access-control-allow-credentials
false
access-control-allow-headers
*
access-control-allow-methods
GET,HEAD
access-control-allow-origin
*
B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/ Frame F9F5
Redirect Chain
  • https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatme...
  • https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rd...
42 B
120 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.205.230 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s24-in-f230.1e100.net
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
location
https://ad.doubleclick.net/ddm/trackimp/N1059923.2019304STRERDIGITALMEDI/B23498714.260328635;dc_pre=CJrJscOgj-YCFdb3dwodQbcASQ;dc_trk_aid=456389860;dc_trk_cid=124647342;ord=1792470942;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
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
302
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
dv-measurements297.js
cdn.doubleverify.com/ Frame 1B8E
271 KB
63 KB
Script
General
Full URL
https://cdn.doubleverify.com/dv-measurements297.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.209.84.82 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-209-84-82.deploy.static.akamaitechnologies.com
Software
Microsoft-IIS/10.0 /
Resource Hash
90ab883e2b560a45b57e19331a777123f10d4d78244d4ae1b51b633dac52112c

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Last-Modified
Wed, 27 Nov 2019 15:09:33 GMT
Server
Microsoft-IIS/10.0
ETag
"80b49aac34a5d51:0"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=946080000
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
64160
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201911261602/
30 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201911261602/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8db624e21c35d3f1626601a61acb544d8dc307f820c325f945d4a2b60cb2c2eb

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Age
122
X-Cache
HIT
Connection
keep-alive
Content-Length
11494
x-amz-id-2
JeZuHJVfRv1fe+D1+Fa4ue0lNxnGAhJVrwYP6QERgDe8lrfjsfaZwQyPE32M/TKF7/aLQAm9fFo=
X-Served-By
cache-fra19123-FRA
Last-Modified
Tue, 26 Nov 2019 21:02:28 GMT
Server
AmazonS3
X-Timer
S1575024778.311097,VS0,VE0
ETag
"2c466e3e28fad37f3a2d6af83dcf47bf"
x-amz-request-id
14817511847B5720
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
169
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.89.16.215 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-89-16-215.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
0
d.nativendo.de/cds/delivery/render/558an9j4/2lla8/66cxs/96b5s/
5 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/558an9j4/2lla8/66cxs/96b5s/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
c2d54d2b322b479adf343ee743a1f066b70085e4adb5a51d7c103ed957dcb986

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
last-modified
Fri, 29 Nov 2019 10:52:58 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1259
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
0
d.nativendo.de/cds/delivery/render/558an9j4/2ll34/5rtog/935z4/
5 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/558an9j4/2ll34/5rtog/935z4/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
9b5c44c4cc85e8d4e2046eb571d8107621cb66dcc57f116c4a968c4790b6bc95

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
last-modified
Fri, 29 Nov 2019 10:52:58 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1283
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 7B8A
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvM24WOilXwUuOIh_dABfNvjWbz-FgSbVtq_gmIVAIDyrJfLqi1xauc2kANI-aBKgkRsZEJ0bZmpwQ9Jhwv42mPT8xUUATrM6m6yzqOGMPdLYlPp2PU-Dlz4iZpLJgvudTcISGSqHc35FsqhE3ZnJgnabdv0g_RiLE2sHfKHtAqG79I7A736AzrbUWDeJ4NtvLEnM7gZdC9GE58IsmGlINoNFzbn8DmYthglUd67llUi3kDr9KszfOwEetPz-3EmkxbAzHtfhBScOyXwVB4&sig=Cg0ArKJSzLd-RXR0tXIbEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s16-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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

timing-allow-origin
*
date
Fri, 29 Nov 2019 10:52:58 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 7B8A
76 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_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,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
29138
x-xss-protection
0
expires
Fri, 29 Nov 2019 10:52:58 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame B9AF
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstBM4ALbLgmbWfcNVMpoYN3P2JT7PcOiBXrJ2rMBKTK2FhVLp8wez-CBjLyfB6incZHfgls9Tfh3g4LvcGPZCIv1uV4v0DmF09BLVUvL2N-phl-4klNdCJXrB2fMF1nlZ7mXCEcmCfBO...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
344 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
access-control-allow-origin
*
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
status
200
cache-control
max-age=173644
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Sun, 01 Dec 2019 11:07:02 GMT

Redirect headers

date
Fri, 29 Nov 2019 10:52:58 GMT
x-content-type-options
nosniff
content-type
text/html; charset=UTF-8
server
cafe
access-control-allow-origin
*
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"
status
302
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
6d4aaff6-4d01-440a-94a7-0d2e09e6bb3e.jpg
c.nativendo.de/cdn/asset/media/crt/55102/2/5/
14 KB
14 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/55102/2/5/6d4aaff6-4d01-440a-94a7-0d2e09e6bb3e.jpg?v=1574775713
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
04e81f322b084bc3e471a66f436f202253fb8adfa80f935f083f933d5604e64b

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
cf-cache-status
HIT
age
91802
cf-polished
origSize=14765, status=webp_bigger
status
200
alt-svc
clear
content-length
14110
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
53d409009821cbb0-VIE
expires
Fri, 27 Nov 2020 09:08:58 GMT
10e96587-2df0-4b4e-b9f6-151369baa657.jpg
c.nativendo.de/cdn/asset/media/crt/54547/2/5/
15 KB
15 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/54547/2/5/10e96587-2df0-4b4e-b9f6-151369baa657.jpg?v=1574352600
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
13e3a7ad5a995b446b7d7bbe43dc427ab5a62cad611246fcbbc3331f2270e821

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
cf-cache-status
HIT
age
590015
cf-polished
origSize=16254, status=webp_bigger
status
200
alt-svc
clear
content-length
15539
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
53d40900a82ccbb0-VIE
expires
Sat, 21 Nov 2020 14:47:18 GMT
fe390c54-c351-48e4-be3a-661ff5ffc942
t.nativendo.de/cds/tracking/event/
0
172 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/fe390c54-c351-48e4-be3a-661ff5ffc942?noc=558an9j4&aid=2lla8&cid=66cxs&cti=96b5s&imp=10&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2F&ts=1575024778
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
last-modified
Fri, 29 Nov 2019 10:52:58 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
fe390c54-c351-48e4-be3a-661ff5ffc942
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/fe390c54-c351-48e4-be3a-661ff5ffc942?noc=558an9j4&aid=2ll34&cid=5rtog&cti=935z4&imp=17&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2F&ts=1575024778
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
last-modified
Fri, 29 Nov 2019 10:52:58 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
t2tv7.html
cdn3.doubleverify.com/ Frame E0F1
0
0
Document
General
Full URL
https://cdn3.doubleverify.com/t2tv7.html
Requested by
Host: cdn.doubleverify.com
URL: https://cdn.doubleverify.com/dv-measurements297.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.209.84.82 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-209-84-82.deploy.static.akamaitechnologies.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash

Request headers

Host
cdn3.doubleverify.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/
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
Referer
https://www.giga.de/

Response headers

Cache-Control
max-age=946080000
Content-Type
text/html
Last-Modified
Thu, 11 Sep 2014 19:15:16 GMT
Accept-Ranges
bytes
ETag
"0ba3b8f4cdcf1:0"
Server
Microsoft-IIS/10.0
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Encoding
gzip
Content-Length
3877
Date
Fri, 29 Nov 2019 10:52:58 GMT
Connection
keep-alive
visit.js
tps.doubleverify.com/ Frame 1B8E
4 KB
2 KB
Script
General
Full URL
https://tps.doubleverify.com/visit.js?bridua=3&tstype=2&eparams=DC4FC%3Dl9EEADTbpTauTauHHH%5D8%3A82%5D56TauU2%3F4r92%3A%3Fl9EEADTbpTauTauHHH%5D8%3A82%5D56Tar9EEADTbpTauTauHHH%5D8%3A82%5D56U2%26C%3Dl&srcurlD=0&aUrlD=0&ssl=https:&aadid=dc8284887766de036d53c81083a36706778d6633&dfs=3&ddur=96&uid=1575024778434994&jsCallback=dvCallback_1575024778434217&dvtagver=6.1.src&navUa=Mozilla%2F5.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&htmlmsging=1&chro=0&hist=2&winh=1200&winw=1600&wouh=1200&wouw=1600&scah=1200&scaw=1600&jsver=297&vavbkt=4,8,1,23&lvvn=26&m1=13&refD=1&referrer=https%3A%2F%2Fwww.giga.de%2F&fwc=0&fcl=623&flt=0&fec=1307&fcifrms=10&brh=2&dvp_epl=134&noc=16&ctx=13817131&cmp=23498714&sid=5504146&plc=260328635&adsrv=1&dvp_tuid=1463095724576
Requested by
Host: cdn.doubleverify.com
URL: https://cdn.doubleverify.com/dv-measurements297.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
213.254.244.18 , Ireland, ASN36062 (DOUBLE-VERIFY - DoubleVerify, Inc., US),
Reverse DNS
Software
Microsoft-IIS/8.5 / ASP.NET
Resource Hash
de27e88a210352f52e35cecc1521b83b2d5b9a59a17ca1e9973d6faff87b09e9

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Server
Microsoft-IIS/8.5
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Type
text/javascript; charset=utf-8
Cache-Control
max-age=0
Transfer-Encoding
chunked
Expires
11/28/2019 10:52:58 AM
data
lb21.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb21.s400.meetrics.net/data?/d+HTDDIAAKktFLkqFFlqwF23A52AwwA/k0FHEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BovFtlFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEovFtlFfzF0hFy0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31AwyA03A34Az1AzBELlnFBUkzFnBP9EAAAAAAABjAEAPBAAFAAjAETA5iAPAAAAAAk3BBA5iAZAAAOA55A55A85B55A58E55A55AFAx2A0xA5BErA5iAPCAAAAAk3BHA5iASksFSFjAAAAAAAAAAAAEAAAjAEAAAAAAAHAklFzrF0vFwBFEAovFtlFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA0AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGoFvtFlfFz0FhyF0zFlpF0lFlyAGvF10FfvFmfFwhFnlFdAAAk3BxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFUOVGUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.81 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h229.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 29-Nov-19 10:52:57 GMT
data
lb21.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb21.s400.meetrics.net/data?/d+HTEEIAA/k0FEImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BovFtlFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEovFtlFfzF0hFy0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31AwyA03A34Az1AzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29By4AywAy2A51AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAzxA53A0yA04AmjEpkF9xAz4Ay5A12AxyAwxAxmAzpF6lF93A3wA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9oEvtFlmBhwFi9BihFuuFlyFmhEwjF91AyzAx5A30Ay0A4mAhwFk9B1yAzxA53A0yA04AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEovFtlFfzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1wAy0A33A41A1yALlnFCTkzFePDDAAAAAAAB121APAAAFAA121Tl35ASksFJEjAAAAAAAAAAAAEAAA121AAAAAAAHAklFzrF0vFwBFEAovFtlFKAnpFnhFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA51A2xAywAxxAGAkpFylFj0FAAAAIAy4AywAy2A51AKA1yAzxA53A0yA04AGAihFuuFlyFKA1yAzxA53A0yA04AKA1yAzxA53A0yA04AvAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGoFvtFlfFz0FhyF0zFlpF0lFlyAGiFhuFulFyBFQtjFmA2NVA
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.81 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h229.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 29-Nov-19 10:52:57 GMT
/
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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.39 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
826 B
Script
General
Full URL
https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.19.202.254 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-19-202-254.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
514362d7c95dc5ff23b5b20119b60bf93f339baf3a0c619dcea70ca6ae0abf7e

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:58 GMT
cache-control
max-age=120
content-encoding
gzip
content-length
714
content-type
application/javascript
/
cx.atdmt.com/
Redirect Chain
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
  • https://cx.atdmt.com/?c=9774098073060771722&f=AYw-Sx_Ksl6HYWGB07KNklA1NuXTMFxc4H4uKvGXu_za_aVWrTTvmFzDLIEu8X7eFqgFhC1aYeSiWXXR8UXxpb-d&id=1773162896260346&l=3&v=0
42 B
405 B
Image
General
Full URL
https://cx.atdmt.com/?c=9774098073060771722&f=AYw-Sx_Ksl6HYWGB07KNklA1NuXTMFxc4H4uKvGXu_za_aVWrTTvmFzDLIEu8X7eFqgFhC1aYeSiWXXR8UXxpb-d&id=1773162896260346&l=3&v=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8004:face:b00c:0:8c , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:58 GMT
p3p
CP="NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
server
proxygen-bolt
location
https://cx.atdmt.com/?c=9774098073060771722&f=AYw-Sx_Ksl6HYWGB07KNklA1NuXTMFxc4H4uKvGXu_za_aVWrTTvmFzDLIEu8X7eFqgFhC1aYeSiWXXR8UXxpb-d&id=1773162896260346&l=3&v=0
content-type
text/plain
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-23=":443"; ma=3600
content-length
0
expires
0
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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
95.100.146.26 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-146-26.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
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

x-amz-version-id
9wmXmJRzbqUN1J_FE3OdLbfoYkoSRNk9
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 21:27:04 GMT
Server
AmazonS3
x-amz-request-id
EEC55C97F4B11502
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 29 Nov 2019 10:52:58 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tkorSDoUnDpOzShun/Dec1WDNLnmS4/a900RaNbXdXjfCkH0LCB9XVRuQLBZtjXprt6bxuTvgAc=
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=56610991
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.99 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 18:48:03 GMT
server
nginx
etag
W/"5dcafe63-9d2b"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 29 Nov 2019 10:57:58 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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:02 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, 06 Dec 2019 01:32:40 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.3bc363a8612dae93e42ce451ef9f7c76.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:58 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1687
content-type
text/javascript
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
494 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=33131471&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

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 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
monitoring.js
cdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://cdn.prod.pubstack.io/monitoring.js
Requested by
Host: boot.pubstack.io
URL: https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.76.218 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
218.76.95.34.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 09:55:10 GMT
content-encoding
gzip
age
3468
x-guploader-uploadid
AEnB2UpjJmEJ0-733cHWJmQmjw3G89fk6Uz8L3z9-EEeaanJOpyy27Bm-JH387jGM-ll7S9HzwTbAxF1j_HsmE1n8xTxZebnpg
x-goog-storage-class
STANDARD
status
200
x-goog-metageneration
2
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
19109
last-modified
Thu, 07 Nov 2019 10:33:20 GMT
server
UploadServer
etag
"c99a31b57f67f7ef385a0bca9adb7bbe"
vary
Accept-Encoding
x-goog-hash
crc32c=tQKzsQ==, md5=yZoxtX9n9+84WgvKmtt7vg==
content-language
en
access-control-allow-origin
*
x-goog-generation
1573122800471985
access-control-expose-headers
Content-Length, Date, Server, Transfer-Encoding, X-GUploader-UploadID, X-Google-Trace
cache-control
public, max-age=3600
x-goog-stored-content-length
19109
accept-ranges
bytes
content-type
application/javascript
expires
Fri, 29 Nov 2019 10:55:10 GMT
Cookie set map
ih.adscale.de/ Frame 9CC4
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
95.100.146.26 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-146-26.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=c57614d842424517b105806913900d75; tu=4#833236056#48~8e42fa81c29be05c5f7ce632548bc697~437506~0~0; ng=2#3507894018#26250412#0#d7~2&d10~1&d2~2&d4~6&d11~3&d8~2&d9~1&d12~3&d1~1&d3~3
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
Referer
https://www.giga.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Fri, 29 Nov 2019 10:52:58 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:58 GMT
Content-Length
653
Connection
keep-alive
Set-Cookie
tu=4#624896457#48~8e42fa81c29be05c5f7ce632548bc697~437506~0~0#101~~437506~437506~1#38~~437506~437506~1#72~~437506~437506~1#42~~437506~437506~1#75~~437506~437506~1#60~~437506~437506~1#108~~437506~437506~1#63~~437506~437506~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
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.125 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:58 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:2156:5400:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Referer
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
Wed, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
5614128
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
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
gmy5Hejy0XSLRmexitSDxykjolwOcr1Z5V207-ESAqfFMKmC4W187w==
via
1.1 fb8c0300277bd0137c1693d3d64ab550.cloudfront.net (CloudFront)
fe390c54-c351-48e4-be3a-661ff5ffc942
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/fe390c54-c351-48e4-be3a-661ff5ffc942?aid=2lla8&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2F&ts=1575024779
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
last-modified
Fri, 29 Nov 2019 10:52:58 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
fe390c54-c351-48e4-be3a-661ff5ffc942
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/fe390c54-c351-48e4-be3a-661ff5ffc942?aid=2ll34&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2F&ts=1575024779
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
via
1.1 google
last-modified
Fri, 29 Nov 2019 10:52:58 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
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=GIGA%20-%20Leidenschaft%20f%C3%BCr%20Technik%20und%20Games&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=8e42fa81c29be05c5f7ce632548bc697&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=138772419893
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
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
a1ad3328e8716939b8757c810bf2f37f2240058fc934ef266472d2fc1968742e

Request headers

Referer
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
Fri, 29 Nov 2019 10:52:58 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
launcher.js
sak.userreport.com/sdm/
63 KB
20 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: nugmw.userreport.com
URL: https://nugmw.userreport.com/rc-ap/000d8512-def7-4586-89d6-5d357296200a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.116 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-116.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c

Request headers

Referer
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

x-amz-version-id
IMogK55qKO1IHLdYEtGgaDgCZp65LBVz
content-encoding
gzip
last-modified
Fri, 01 Nov 2019 09:56:54 GMT
server
AmazonS3
age
291
date
Fri, 29 Nov 2019 10:48:07 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=300
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
u9F0IlQohztzkFUI9cg_ZoemcXLEB3hNTaoKKgbKlfDLdv4BQZZMYA==
via
1.1 adb1b226e6965f6206603ba087bd4a0a.cloudfront.net (CloudFront)
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/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.34.92.224 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-34-92-224.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
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
Wed, 20 Nov 2019 15:05:40 GMT
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 15:04:46 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 C9F1
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWSfkWiRFEiRsESUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4210918948358867557
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4210918948358867557
Requested by
Host: www.giga.de
URL: https://www.giga.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:58 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 29 Nov 2019 10:52:58 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4210918948358867557
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
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
fetch_frame_2019111801.html
ff.doubleclick.net/tag/js/ Frame A0F9
0
0
Document
General
Full URL
https://ff.doubleclick.net/tag/js/fetch_frame_2019111801.html
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
2a00:1450:4001:80b::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
ff.doubleclick.net
:scheme
https
:path
/tag/js/fetch_frame_2019111801.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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUn8BMjXpA0trwZyClLDxNw6GlXv12gu4lsP1y-nCjdsaUxNukjWs2257z3a
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
Referer
https://www.giga.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
6737
date
Fri, 29 Nov 2019 10:02:53 GMT
expires
Sat, 28 Nov 2020 10:02:53 GMT
last-modified
Mon, 18 Nov 2019 14:07:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
3005
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
activation
adstax-match.adrtx.net/ Frame EB2C
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
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.10 /
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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/
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
Referer
https://www.giga.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 29 Nov 2019 10:52:58 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.10
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
5231974248
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5231974248
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:52:59 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5231974248
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
d67dc33d-8b9d-4887-a4b4-535035ed9b74
https://videos.giga.de/ Frame A013
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/d67dc33d-8b9d-4887-a4b4-535035ed9b74
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

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-Length
31
Content-Type
application/javascript
800e09cb4371013cf06be8ebc1_ciA5NTADOTE4ZWMzMGM2OGM=.jpg
files.giga-video.de/96/b1/b4/ Frame A013
65 KB
65 KB
Image
General
Full URL
https://files.giga-video.de/96/b1/b4/800e09cb4371013cf06be8ebc1_ciA5NTADOTE4ZWMzMGM2OGM=.jpg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
a9cc3aa5da89c156ec96838148a04d96c95e9345ba63cad4022b71a435f34348
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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 Nov 2019 16:25:54 GMT
x-content-type-options
nosniff
age
152825
filer-source
e5994fbbbdc71dfcd836ca09e952fe93c786a9403dbc3e494cbb8fef04a3483a
x-cache
HIT
status
200
accept-language
bytes
content-length
66169
x-xss-protection
1; mode=block
last-modified
Wed, 27 Nov 2019 16:25:54 GMT
server
nginx/1.10.3
filer-attr
W1s5NTAsNTM0XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 27 Dec 2019 16:25:54 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame A013
53 B
703 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.199 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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:53:00 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
70F43B75F889E10F
Content-Length
53
x-amz-id-2
zdCq9fBW6ZlTtzIIAS1xAhy3EVYMGwmLAf0A5JSWSdXCXPR3hkccXz+KrsoiLTuQRFuKNMJ+Rp0=
Last-Modified
Fri, 29 Nov 2019 08:46:24 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame A013
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-c972511a.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

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:52:59 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
Fri, 29 Nov 2019 11:07:59 GMT
usersync
uss.xplosion.de/
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=8e42fa81c29be05c5f7ce632548bc697
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
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

status
200
date
Fri, 29 Nov 2019 10:52:59 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame A013
724 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

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
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:52:53 GMT
Via
1.1 b912dc97777020eb19579888add26978.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
13
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:39 GMT
Server
AmazonS3
ETag
"bb9cc8757cf3880ea4d6e84944c9118b"
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
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
NCrHZ-QqxT7EdhE3XUNMVM1Ti0C5jWHwRD2us8RIod75ISYQLtWI3A==
Expires
0
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame A013
196 KB
196 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=sejdAMyEtM
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
d4353cb2ae6ea7a42c4b32e3bd4551548a6f5490553f4043b2b3d6430c2a6140

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
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:52:53 GMT
Via
1.1 b912dc97777020eb19579888add26978.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
41
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
200236
Last-Modified
Fri, 29 Nov 2019 09:50:25 GMT
Server
AmazonS3
ETag
"8f6f582d4d0ddb2b242a2cf048c22e23"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
6egcZOGlkFzdcrPBxqRay-_IeRHynkfQzXVWVccdn3HVGmIgu2uM5w==
truncated
/ Frame A013
196 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d4353cb2ae6ea7a42c4b32e3bd4551548a6f5490553f4043b2b3d6430c2a6140

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
5231974257
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5231974257
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:53:00 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5231974257
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
event.png
tps20233.doubleverify.com/ Frame 1B8E
67 B
487 B
Other
General
Full URL
https://tps20233.doubleverify.com/event.png?impid=c37fea68f1a94e7cb90b8399a4081cb3&dvp_ealslr=1&vdur=43&eoid=6&msrjs=297&pltfrm=Linux%20x86_64&isvelg=1&vit=2&engms=1&engisel=1&dvp_esdtms=2088&cbust=1575024780498819
Requested by
Host: cdn.doubleverify.com
URL: https://cdn.doubleverify.com/dv-measurements297.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
213.254.244.18 , Ireland, ASN36062 (DOUBLE-VERIFY - DoubleVerify, Inc., US),
Reverse DNS
Software
Microsoft-IIS/8.0 / ASP.NET
Resource Hash
ebf4f635a17d10d6eb46ba680b70142419aa3220f228001a036d311a22ee9d2a

Request headers

Referer
https://www.giga.de/
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
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:52:59 GMT
Content-Encoding
gzip
Server
Microsoft-IIS/8.0
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Type
image/png
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0
Transfer-Encoding
chunked
Access-Control-Allow-Credentials
true
Expires
11/28/2019 10:53:00 AM
4863977886
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
206 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4863977886
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

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
Referer
https://www.giga.de/
Origin
https://www.giga.de

Response headers

date
Fri, 29 Nov 2019 10:53:01 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/4863977886
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame A013
53 B
703 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=5086241278
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
52.219.72.199 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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:53:02 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
033CDFC1CBEA891E
Content-Length
53
x-amz-id-2
QUs+fmQCdWvYTkU2jK5JsRuA5mZ3y3IWJ9gvXntPknO10qGbwYIBmOXuhXEjtbnueX8Y7FvA8BU=
Last-Modified
Fri, 29 Nov 2019 08:46:24 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame A013
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=7705477623
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
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

Referer
https://videos.giga.de/embed/415710348
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 10:53:01 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
Fri, 29 Nov 2019 11:08:01 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame A013
724 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1561090584
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-52.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

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
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

Date
Fri, 29 Nov 2019 10:53:01 GMT
Via
1.1 b44e2902bb3501d47514e51618f1bda5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:39 GMT
Server
AmazonS3
ETag
"bb9cc8757cf3880ea4d6e84944c9118b"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
0FMLH4Wf6DcAFKc7PWtFMW8xETwdhVZQZOiH39ktyu4FAgN-rRV0KQ==
Expires
0
/
ssl.3.damoh.giga.de/2adf025d17317ed94f2d7aec53ae76dd2e85ac9a/ Frame A013
724 B
2 KB
XHR
General
Full URL
https://ssl.3.damoh.giga.de/2adf025d17317ed94f2d7aec53ae76dd2e85ac9a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.69.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.69.4.46.clients.your-server.de
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

Request headers

Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 29 Nov 2019 10:53:01 GMT
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:40 GMT
Server
AmazonS3
Etag
"bb9cc8757cf3880ea4d6e84944c9118b"
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-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
hic_qos
ssl.1.damoh.giga.de/ Frame A013
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,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.giga.de

Response headers

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

Request headers

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

Response headers

Content-Type
text/javascript
/
ssl.3.damoh.giga.de/41cfb859ef695a207677563a911627db94cf002b/ Frame A013
109 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/41cfb859ef695a207677563a911627db94cf002b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG9vUGhpZW1hQWh6YWhLb3c9b29QaGllbWFBaHphaEtvd3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5PayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5DbihtKTtiLkJuKGwpO2IucW4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Lbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5ia3x8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuT2s9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYWo9YTthLnByb3RvdHlwZT17YW86ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmFvKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxEazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYm46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuYW4oYi5kYXRhKX0sYW46ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxCazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHJtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxNbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuaGwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTW4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUWs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGhsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5RayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LG1tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEppOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApkbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxCajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxSajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQ2koKXx8Yi5KaSgpfHxiLmRtKCl8fGIuQmooKXx8Yi5saygpfHxiLnFqKCl8fGIuUmooKX19O3JldHVybiBudWxsIT1iLktrKCl9LERsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFJsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxsbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxUbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlJsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVW46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5kbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVmsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5ybShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5CayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxCbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQm0oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCktuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sa206ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYWp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLiRpPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuWG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWG89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Ebz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eudms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnVrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuV289e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Euem89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkFvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy4kaXx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkhrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxObDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGZtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5ObCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmJqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLnZvfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuS2k9YX0pKGMpO3ZhciBLPWMuS2l8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Haj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5EbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuJG4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxsbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkdqfHx0OyhmdW5jdGlvbihjKXtjLklqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5hbSgpfHx0aGlzLnhrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHhrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLklqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucWs9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGVtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0saW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmVtKCk7aWYoIXRoaXMuaW0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5xa30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxMbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEVtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5wbHx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLlNqfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5kbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5qanx8cmE7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmRsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5panx8c2E7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5IbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLmxtKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSGw6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmtqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuT2l8fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5la3x8d2E7KGZ1bmN0aW9uKGMpe2MuZGs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuS20oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5SaygpLAp0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubmE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubmE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubmE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGptOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMuaG0oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5tbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LG1uOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUms6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLmptKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sU2s6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuYm0oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxibTpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkRsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LCRrOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSm8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5KbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRrKCl9LmJpbmQodGhpcyksNTApKSl9LHVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Lbyl7dGhpcy5Lbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5maz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmZrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5jcHx8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFltOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Eanx8QmE7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkhifHwodGhpcy5IYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkhiKyssMTU8dGhpcy5IYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlltKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkNqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkVqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Ja3x8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuJG09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy4kbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxzYTpmdW5jdGlvbigpe3JldHVybiEwfSxaazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5nanx8R2E7KGZ1bmN0aW9uKGMpe2MuZmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZmp8fEhhOyhmdW5jdGlvbihjKXtjLmhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuU2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaGp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy51anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEZuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0seWs6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5janx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkZuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmRqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLkxpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSW46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxzbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scm46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5MaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLiRiPSIiO3RoaXMuZ2Q9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuV2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUGI9IiI7dGhpcy5RYj1bXTt0aGlzLlJiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlZiPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5laj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLiRiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWmIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucGEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLiRiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5aYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnBhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLldiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sWmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fHRoaXMuWmJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuS2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCktsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuJGImJgooYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5IbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sWWs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuVGsodGhpcy56YS5jbGllbnRBUElzKX0sVGs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5wYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5ZaygpO3RoaXMuQW0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucGEpdGhpcy55bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucGErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlRiKCk7ZS5GYyhrLlhtKTsoYT1lLkNiKHRoaXMueGQoKSkpfHwoYT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxYbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5lbmFibGVkfHwhYS5mb3JjZV9kaXNhYmxlZCl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTsKdGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlRiKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucGF9ZWxzZSBkPXRoaXMucGE7aWYoIWQuZW5hYmxlZHx8IWQuc2VydmVyfHwhZC5hbGlhcyl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuZ2E9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT0KdGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHxlLkYoIjF1bmQxLmRlIikpJiYhdGhpcy5MYygpKWZvcihiPTA7Yjx0aGlzLmdhLmxlbmd0aDtiKyspdGhpcy5nYVtiXT10aGlzLmdhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuT2I9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLkplPWQuYWRwYXRofHwiIjt0aGlzLnNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmdhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuT2ImJnRoaXMuQWEmJnRoaXMuZ2EubGVuZ3RoP3RoaXMuTWMoITEpOih0aGlzLkhhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpLAp0aGlzLlRiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy50YSh0aGlzLk9iKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBBKHRoaXMuT2IrdGhpcy5vZSgiY3VzdG9tZXIiKSk7dGhpcy5JYShhLHRoaXMuY28uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImN1c3RvbWVyIik7Yj90aGlzLlFqP3RoaXMuZGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuUWo9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLk1jKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxjbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT0KYi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0hMDt0aGlzLk1jKCEwKTtyZXR1cm59fWlmKCFkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVGQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5HZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlBiPWQudGVzdGhpZGV8fCIiO3RoaXMuUmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5VYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9CmQudGVzdDNwY29va2llfHwiIjt0aGlzLiRiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWmI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlRlPWQuanNwb3B1cHN8fCExO3RoaXMudGI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuVmI9ZC52cGFpZHx8ITE7dGhpcy56YS52cGFpZD10aGlzLlZiO3RoaXMuQWY9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuT2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5pZT1kLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5QZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9OyF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5pYz0hMCx0aGlzLk1jKCEwKSk6dGhpcy5pc0VuYWJsZWQmJgohdGhpcy5wbygpJiYodGhpcy5QYnx8dGhpcy5SYnx8dGhpcy5RYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLnRlKCksdGhpcy5UYigpKTp0aGlzLmhvKCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuR2YoKSl9fSxobzpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLmlvKCl9LGlvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYT0iaW5saW5lZXZhbGRhdGEiLApkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLlgoMTApLGg9ZS5YKDEwKSxGPWUuWCgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKStiKEYpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSsKYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS56YihiKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGIpe31pZigzIT1kKXt2YXIgYz1lLnJkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5TYSgpKXtpZih0aGlzLnphJiZ0aGlzLnphLnBsYXllciYmdGhpcy56YS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixhLCEwKTtyZXR1cm59dGhpcy5kYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sR2Y6ZnVuY3Rpb24oKXt0aGlzLlM9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkhhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5UYigpLHRoaXMudGUoKSl9LGZvOmZ1bmN0aW9uKCl7aWYodGhpcy5QYil7dmFyIGE9ZS5yZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMub20oKSl0aGlzLk9kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlBiKTtnLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuUGIpO2cuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuZGkoKX19ZWxzZSB0aGlzLmRpKCl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLiRoLmJpbmQodGhpcyksZy5iaW5kKHRoaXMpKX1mdW5jdGlvbiBnKCl7dGhpcy5PZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuUWI9dGhpcy5VYykmJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuJGgoKX0sCmxvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyBBKGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxkaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigpKTt0aGlzLm1vKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5jaS5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5SYiYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5jaSgpfSxtbzpmdW5jdGlvbihhLApnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZCxnKXtnPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfWNhdGNoKGwpe2YoKX19LCRoOmZ1bmN0aW9uKCl7aWYodGhpcy5vYyl0cnl7ZS56ZCh0aGlzLm9jLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkFiPQohdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LGFpOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5UYigpO3RoaXMudGUoKX0sb206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sVGI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpOwp0aGlzLlZkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVmQmJnRoaXMuVmQoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sWGs6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLlpsKCkpe3ZhciBhPXRoaXMuSWwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9CiEwKTtjJiZlLm1tKCkmJihhLlFnPSEwKTtoJiYoYS5aaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxVazpmdW5jdGlvbigpe2UuU2EoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6CiIiO3RoaXMuTGMoKXx8KGE9dGhpcy50YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxWazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Dby5iaW5kKHRoaXMpLHRoaXMuQm8uYmluZCh0aGlzKSl9LENvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxCbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LExiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sdGE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5oa3x8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLndvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5lYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucmE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Oaz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5nbD1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLkliPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlViPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSmI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVm09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuWmk9YTthLnByb3RvdHlwZT17em46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuR2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlduKCk7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5YaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLkFuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVmIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5WYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVWI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy5hbCgpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlRsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkNsKGIpKSk7cmV0dXJuIGd9LENsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxUbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scWE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuWG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlhuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuRG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLllvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLlpvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5NbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Bbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5mYyhhKTt0aGlzLlBhKCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5FayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuemsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYmwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucmE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoZyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxObjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm1hJiZlLkRrKHRoaXMuYi5vcmlnaW4ubWEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucmE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTmIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5XbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuTG8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5NbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5RbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVW8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuVG8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuZGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlBvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5PbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk5iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE5vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sT286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxRbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFBvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxVbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxTbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxMbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sems6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIudGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLklvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxDazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5KYiYmIXRoaXMuZWMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5GbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5FbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5KYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnRrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx3azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVW4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLndrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLk9tLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmVjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApJbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmVjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5VaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlViKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVWI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVWIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmVjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5KYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sV246ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxYbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE5iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSmIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5VbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUua20oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnlrKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQWsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEFrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxhbDpmdW5jdGlvbigpe3RoaXMubGM9e319LFpuOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGtsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEZvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Hby5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmRjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5kY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuZGMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxFbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnJhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZ2w7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkliO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnJhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5zYSYmdGhpcy5hLmMuc2EoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUuaWEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTmIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuTmIoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLnRtKCkmJnRoaXMuc20oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLlZiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxKbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpOwp0aGlzLmZmPXRoaXMuV2M9dGhpcy5SZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuSmwoKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWm4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlZtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEud24oKSx0aGlzLmpjPSExLGUubyhrLmZsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5PZSh0aGlzLnZpZGVvLGEpP3RoaXMuUmgoKTp0aGlzLkNkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl9LmJpbmQodGhpcyksMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZGMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5OaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLllnKCkpO3JldHVybiBhfSxGZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuWml8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubWE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5EbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5jaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkNnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5JYShiLHRoaXMuQ20uYmluZCh0aGlzKSx0aGlzLnptLmJpbmQodGhpcykpfSxUZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5xbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5lbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxxbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LENtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9CnRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLmloPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZTpELlVmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuQ2IodGhpcy5tYSksITApfWNhdGNoKGMpe319fSxEbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5sYXx8KHRoaXMubGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucWEodGhpcy5RYSh3LlljLHtlcnJvcjp0aGlzLlBmP0QuZWU6RC5VZn0pKX0sem06ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuUWEody5UZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudW0oKT90aGlzLm5vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucWEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLnhvKCkmJnRoaXMuamYodGhpcy5pbCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5iZigpfSxBaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQWgoKX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rbygpP3RoaXMuam8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnFhKHRoaXMuUWEody5ZZCkpOnRoaXMucWEodGhpcy5RYSh3LlNmKSksITEpOih0aGlzLnFhKHRoaXMuUWEody5ZYywKRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7dGhpcy5wYXJlbnQuamYoYSl9LGlsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubWF8fCh0aGlzLm1hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy4kZygpO2EuZGM9dGhpcy5FbCgpO2Eua3E9W107YS5vcmlnaW49dGhpczthLnY9dGhpcy5BbCgpO2EuQmY9dGhpcy5TbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuUGc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGEpe3RoaXMubWF8fAoodGhpcy5tYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubWEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5ZZC5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRmwoKSk6YS5NYS5jb25jYXQodGhpcy5PbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZmMmJnRoaXMucGFyZW50LmZjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGEpLGI9MCl9LGZjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmZjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxubzpmdW5jdGlvbigpe3JldHVybiBiPGd9LGtvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kZygpLmxlbmd0aH0sam86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEZmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sYmk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubWE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5tYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm1hPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx1bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZGgoKS5sZW5ndGh9LGRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sQmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIkFkU3lzdGVtIil9LFllOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5waChhLnBhcmVudE5vZGUpOiExfSxPbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxGbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCiRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEVwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxBbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLnZkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFNsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVG4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxEZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnZkKGEpOiIifSx2ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuY2t8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5hcHx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5kYz0iIjt0aGlzLnY9dGhpcy50Yz10aGlzLndiPSExO3RoaXMuS2U9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkxlPSIifWMuRmo9YTthLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTWw6ZnVuY3Rpb24oKXtpZighdGhpcy5LZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLmxhKXt2YXIgYT10aGlzLm9yaWdpbi5sYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sWWc6ZnVuY3Rpb24oKXtpZih0aGlzLkxlKXJldHVybiB0aGlzLkxlO3ZhciBhPSIiOyhhPXRoaXMuTWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkxlPWF9LFdsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ganx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5tbHx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LFdmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxhZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGVlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLnBqfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLk5pfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnhsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuUWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5VZD1bXTt0aGlzLk5oPVtdO3RoaXMuZGY9W107dGhpcy5Ibz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLlpwPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVWQucHVzaCh7c3JjOmQsZnJhbWU6aCxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5kZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmRmW2NdO2QudHlwZT09PWEmJmQuUGsodGhpcy5HbChhKSl9fSwKR2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApWbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uV207cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5WbChjKSx2ZW5kb3I6Y30pO3RoaXMuVm4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkhvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSxQazpjLGZxOiExfSl9LFZuOmZ1bmN0aW9uKCl7dGhpcy5OaC5tYXAoZnVuY3Rpb24oYSl7YS5ubXx8KGEuWXAoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuanEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5ubT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLndtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5tZz0hMTsKdGhpcy5hYz1bXX1jLk1pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxibzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMubWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sY206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHdsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmFjLmxlbmd0aDthKyspdGhpcy5hY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuYWN8fCh0aGlzLmFjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5hYy5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk1pfHxZYSxCPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5vbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMub2x8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuemp8fGFiOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWWI9dGhpcy5ZYnx8ITE7dGhpcy5kZz10aGlzLmZnPQp0aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5taD0hMDt0aGlzLnZnKCl9LmJpbmQodGhpcykpOwp0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWWIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxxZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdWw6ZnVuY3Rpb24oYSxiKXt0aGlzLlliPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLllifHwzMDI9PXRoaXMuWWI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm9hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnlqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Baj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHBtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkpqLnJrLnBrP3dpbmRvdy5PTy5Kai5yay5way5BcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucG0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkFqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy4kb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5laCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSGl8fGZiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm9hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkdpfHxnYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5MaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLklpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlBtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuV2p8fFQ7KGZ1bmN0aW9uKGMpe2MuVmo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUW0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWWwoKX0sUW06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMub2EoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlZqfHxVOyhmdW5jdGlvbihjKXtjLlhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkJkJiYoYT1lLmxsKGEsdGhpcy5CZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0sb286ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxZbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5vbyhhKX19KX0pKGMpO3ZhciBqYj1jLlhqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuYWt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5EaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRWl8fAptYjsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkZpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy52bXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuS2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLnhnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sV2c6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7aWYoYT10aGlzLktnKGEpKXJldHVybiB0aGlzLkVjPQphfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTthJiZhLm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmCnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpO2EuYXV0b3N0YXJ0JiYhdGhpcy51aSYmKHRoaXMuZygpLHRoaXMudWk9ITAsdGhpcy5rYSgpKTsKYi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWIoYVtkXSksdGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgcmIoYyx0aGlzLkcpKS5mKCkpfX1lbHNlIHRoaXMuUCgpfX0pfSkoYyk7CnZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLkJpfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCnNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB1Yj1jLmprfHx1YjsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxJYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksCmE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm9hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9ITA7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmdldFBsYXllcigpOwp0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCk7ZWxzZXt0aGlzLkQoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLmlrfHx2YjsoZnVuY3Rpb24oYyl7Yy5raz0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5Na3x8eWI7bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGI9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLApiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sWW46ZnVuY3Rpb24oKXt0aGlzLmtmPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5Panx8CnpiOyhmdW5jdGlvbihjKXtjLk5qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5HbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMucGN8fHRoaXMucGMrKyx0aGlzLnBjPD10aGlzLkdtPyh0aGlzLnBjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWW4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuTmp8fEFiOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYlswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYSYmKGE9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEFiKGEsCnRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLmxqfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Naj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLk1qfHxFYjsoZnVuY3Rpb24oYyl7Yy5Maj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnhtKCk6dGhpcy51ZygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZygpfHwodGhpcy5tKCJjb250ZW50cGxheSIpLHRoaXMuZyghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjbDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubmEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/KHRoaXMucygpLHRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxCYjpmdW5jdGlvbigpe2lmKCF0aGlzLkRoKWZvcih2YXIgYT0KYy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRmI9Yy5Manx8RmI7KGZ1bmN0aW9uKGMpe2MuWmM9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxXazpmdW5jdGlvbihhKXthPW5ldyBFYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLldrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10uZmVybW9kO2QmJmEucHVzaChkKX1pZihhJiZhLmxlbmd0aClyZXR1cm4gYX1hPVtdO2lmKChiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYi5sZW5ndGgpe2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXSYmYltjXS5mZXJtb2QmJmEucHVzaChiW2NdLmZlcm1vZCksCmJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBJYj1jLlJtfHxJYjtuZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKTphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPQpjLnNqfHxXOyhmdW5jdGlvbihjKXtjLnJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMucmp8fFg7KGZ1bmN0aW9uKGMpe2MudGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudGp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5TbXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSwKYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTWI9Yy5XaXx8TWI7KGZ1bmN0aW9uKGMpe2MuVmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnRoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09CmEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlZpfHxOYjsoZnVuY3Rpb24oYyl7Yy5YaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0KMDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlhpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm5sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5ubHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubms9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSl7Zm9yKHZhciBiPWE9YVswXTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7CmJyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlhjfHwodGhpcy5YYz0hMCx0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMubmt8fFJiOyhmdW5jdGlvbihjKXtjLm1rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1oOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9KSwKYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5NaC5iaW5kKHRoaXMpLDEwKX0sYmM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLnNrPQohMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMuc2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmJjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1oKCk7dGhpcy5aZigpO3RoaXMubG4oKX0sbG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmJjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBSYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhLmhuKCksYT1uZXcgU2IoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMub2t8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5Uanx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuR2gmJih0aGlzLkdoPSEwLHRoaXMuVSYmdGhpcy5VKCkpfX0pfSkoYyk7dmFyIE49Yy5aanx8TjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8Cih0aGlzLkhiPTApLHRoaXMuSGIrKywxNTx0aGlzLkhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5PPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMuWWp8fE87KGZ1bmN0aW9uKGMpe2MuJGo9CnQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5qYXx8CnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLiRqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5uanx8WTsoZnVuY3Rpb24oYyl7Yy5taj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuTGIoMTApO3RoaXMucmgoKX0scmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LENhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5tanx8WjsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5vanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5naz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuZ2t8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVGl8fGJjOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnRnKCl9LHRnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5TaXx8CmNjOyhmdW5jdGlvbihjKXtjLlVpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5VaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuVG18fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGdjPWMueGl8fGdjOyhmdW5jdGlvbihjKXtjLndpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5nKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5wZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLDEwMCl9fSxnOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRChhKX19KX0pKGMpO3ZhciBoYz1jLndpfHxoYzsoZnVuY3Rpb24oYyl7Yy55aT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFJhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2M9Yy5VbXx8a2M7bmV3IGtjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBYYj9udWxsOlhiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlZ9fWMuSGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5RbChhKTpbXSxjO3RoaXMudWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMudGg9ITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLAp0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sJG46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlNiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uU2IpfX19KShjKTt2YXIgbGM9Yy5Ianx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1jPWMuamx8fG1jO25ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueW8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5GYyhrLk5tKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Qy53aWR0aD0xO0MuaGVpZ2h0PTE7Qy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtDLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIHFjPUMuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscGM9Qy5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyk7dmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwKITEpO0cuZmEoKTt2YXIgcmM9cWMoZnVuY3Rpb24oKXtlLk9nKHdpbmRvdyxHLmZtKCkse2lkOnJjfSl9LDUwMCksaGE9ZS5YKDEwKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuWWl8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IaD10aGlzLmNvbmY9dGhpcy5uYj10aGlzLnBsYXllcj1udWxsO3RoaXMueWQ9MDt0aGlzLmJiPSIiO3RoaXMuRWQ9W107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gY30sU2M6ZnVuY3Rpb24oYSxjKXtlLkYoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7CnZhciBkPSExLGY9ITE7aWYodGhpcy5nbSgpKXRoaXMubmIuaSh0aGlzLm5iLkpjLHRoaXMubmIucGEsdGhpcy5uYi5vZixmdW5jdGlvbigpe3RoaXMuU2MoYSxjKX0uYmluZCh0aGlzKSx0aGlzLm5iLkRjKTtlbHNlIGlmKHRoaXMuJGwoKSl0aGlzLnhuKGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLmJvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLm5iLGgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkZtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLlVlJiYoZD10aGlzLnBsYXllci5VZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5XZShhLGQsZik7dGhpcy5wbGF5ZXIuVGgobCl9fSxnbTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLnlkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMueWQuZ2V0VGltZSgpLHRoaXMueWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnlkPWE7cmV0dXJuITF9LFNuOmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UudmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX0sUm46ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSGgpe2UudmYoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkhuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLkpnKGQpKT90aGlzLlNjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Sbi5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuS2EoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UudmYoIm1pZHJvbGwiKTtpZighdGhpcy54aCl7dGhpcy54aD0hMDt2YXIgYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5TYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5uZCx0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5FZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuYnAoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbY10udXJsLGFbY10ucGxhY2Vob2xkZXIsYVtjXS5hbGlhcyxhW2NdLm1hY3JvKX10aGlzLkZkPXRoaXMuRWQubGVuZ3RofSwkbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5GZCYmKGE9ITApO3JldHVybiBhfSx4bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxGbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9CnRoaXMubWZbZF0sYT1hLnJlcGxhY2UoYy5tYWNybyxjLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGVhPWMueml8fGVhLFE9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5Lanx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKG9vUGhpZW1hQWh6YWhLb3csb29QaGllbWFBaHphaEtvdyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.69.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.69.4.46.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Referer
https://videos.giga.de/embed/415710348
Origin
https://videos.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 29 Nov 2019 10:53:01 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
event.png
tps20233.doubleverify.com/ Frame 1B8E
67 B
487 B
Other
General
Full URL
https://tps20233.doubleverify.com/event.png?impid=c37fea68f1a94e7cb90b8399a4081cb3&msrcanlm=264&msrcannum=2&eoid=10&ismms=51&isumms=51&isvelg=1&nvr=2&isbxdms=2151&b0=2230&engisel=1&dvp_vsosnmr=3&dvp_mvpw=device-width&lftb=2230&sftb=2230&naral=256&vct=1&vphgt=1200&vpwdth=1600&scrhgt=1200&scrwdth=1600&strp=0&advisonl=false&engalms=51&dvp_hdnAd=11013&dvp_dpr=1&dvp_itg=HEAD:1,SCRIPT:10,BODY:1,IFRAME:2,DIV:3,&dvp_ltspl=854&dvp_esdtms=3088&cbust=1575024781497242
Requested by
Host: cdn.doubleverify.com
URL: https://cdn.doubleverify.com/dv-measurements297.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
213.254.244.18 , Ireland, ASN36062 (DOUBLE-VERIFY - DoubleVerify, Inc., US),
Reverse DNS
Software
Microsoft-IIS/8.5 / ASP.NET
Resource Hash
ebf4f635a17d10d6eb46ba680b70142419aa3220f228001a036d311a22ee9d2a

Request headers

Referer
https://www.giga.de/
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
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:53:01 GMT
Content-Encoding
gzip
Server
Microsoft-IIS/8.5
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Type
image/png
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0
Transfer-Encoding
chunked
Access-Control-Allow-Credentials
true
Expires
11/28/2019 10:53:01 AM
data
lb21.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb21.s400.meetrics.net/data?/d+HTFJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A31AwyA03A33A0yA3wE4qEooFooF5yE5BEUkzFYBPBAAYGAFCABl35AZAAAOA55A55A85B55A58E55A55AGAyyAw1A53Arl35APgAAAZAwSAcAAAAPIBAYGAFCAHl35ASksFsRdYGAFCACMA6DAFAAAl35AAALLo0F0wFz6BvvAjkFuuBz0FyvFllFykFpnFp0FhsFtlFkpFhuBklFvBEkzFvyAwxA5fEyzAx2AyfEwwAxfEBtFh6FvuF33Aw4Ey1AwfEy5AxxAvpEukFl4FuoE0tFs/BjsFpjFrUFhnF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrFlyA1zAG4FhpFlyA1zAEBFLBFPqFz2FMhF4XEoXFyJEJyFGNFYWFnzBxrFH3Fx3EtzBN6FVtBYfFsVFODFfrFitF62Bo3FXSFxFF6BFuMFWVF25FlxBRQFzPFzQE1lEIpFHRFzwALOF4WE5xBL5FIyBwKFREF20ANQFfrF3tAfyBySFT1FxWFraFmyBB0FaoFDRFFyFziFrQFRLF35FNrFqOFzLF1FFEhFF2BxwESYFGVFCRFu3FjCF0xERlFyIFOmFyHFtaFSXF3EFMDF2FEK4FOzBK5FmxFQwBf1Bz4BlKFk1F0FEEZFmaFsqFJrFQtF1NFhDF44AyCFULFWOFRTFUrFLIFUxF5VFYhF5mEJtBFYF2yA34BE0BBEFyEE0yAZ4FyWFtJEyEFGnFZZFSIFnWFIzBJwFz4BBvFv2FSSF1lBy1Ay2AzpFnlBy1AzEEDnFwBEyLFKTF6CFTwBVyFaqFq0F5qFFBFFlBy1Ay2A1yFsmFp4FlyA1zAExBlyA1yA2hEk1FysFlyA1zAEoF00FwzF6vAvhEkuBkvF1iFslFjsFpjFruBulF0lByGEkkFtlByGE0yFhjFrjFsrFlyAGOFxwA15A5yAzuAywAx5AzwA0TEUSFFSFEJFHJFUBFMNFFEFJlByGECyBz0A54A3xA0uAy2AwzAy4A2zA1lAzCEkjFf0FyrFfhFpkFlzAE0B12Az4A54A2wAlzACkFjfF0yFrfFjpFklBzEExyA02A03Az0AylAzCEkjFfsFh0FlzAElBzCEkjFfyFkpFklBzEElzAC0FhnFfmFvyFfjFopFskFfkFpyFljF0lFkfF0yFlhF0tFluF0lBzEElzAC0Fm1FhlBzEElwABBFJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFisHiWA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.81 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h229.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:53:03 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 29-Nov-19 10:53:02 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1575024787863&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Referer
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

Pragma
no-cache
Date
Fri, 29 Nov 2019 10:53:07 GMT
Last-Modified
Sat, 21 Nov 2009 10:52:48 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
Fri, 23 Nov 2012 10:52:48 GMT

Verdicts & Comments Add Verdict or Comment

158 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 string| cookieName function| getCookie function| setCookie object| smbContext object| LUX object| POST_META object| smbt object| smbadloader string| GoogleAnalyticsObject function| ga function| adLoader object| apstag object| _m6rq object| smbDmpTracking boolean| smbt_only function| requirejs function| require function| define 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 function| setImmediate function| clearImmediate object| google_tag_data object| gaplugins object| gaGlobal object| gaData boolean| apstagLOADED function| sdibgclick object| _ecoconf object| _tfa function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| cp2 object| nativendo_588f272a3e49c_conf object| TFASC object| TRC object| _taboola number| taboola_view_id object| TRCImpl function| __trcError function| __trcJSONify object| queue object| _econa function| send object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken function| _ number| _m6rApiLoaded function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c number| google_srt undefined| google_measure_js_timing object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk boolean| google_noFetch number| __google_ad_urls_id number| google_unique_id object| google_reactive_ads_global_state function| checkOmid3pExist object| de_meetrics undefined| list string| preloadType object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet function| $ function| jQuery object| _m6rOnce number| _m6rContainerLoaded function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| __google_ad_urls object| ampInaboxIframes object| ampInaboxPendingMessages boolean| google_osd_loaded boolean| google_onload_fired function| webpackJsonpdkuim object| Base64 boolean| dkuimInited object| confiant function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| nativendo_588f272a3e49c_map string| sdm_ift function| confiantTryToGetConfig object| containers object| images object| a object| Adform object| pbstck object| stroeerCore function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript string| apsrc object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| audienceProjectLayer

21 Cookies

Domain/Path Name / Value
.agkn.com/ Name: u
Value: C|0AEAlc7UKJXO1CgAAAAAAAg1RAQCADVIBAIA
.agkn.com/ Name: ab
Value: 0001%3AF4e0BzY5daaYJzCODUkyy5Is%2FF9K8c8mHcXJu2ftvkctJg8XNIEz1w%3D%3D
.m6r.eu/ Name: adscale
Value: 2019-11-29T10%3A52%3A58.277Z
.m6r.eu/ Name: appnexus
Value: 2019-11-29T10%3A52%3A57.878Z
.m6r.eu/ Name: yieldlab
Value: 2019-11-29T10%3A52%3A57.876Z
www.giga.de/ Name: smbVideoStickyAutoplay-GIGA
Value: 86
www.giga.de/ Name: _econa
Value: d60947d71dc6b8363d958031bdb4812c
.giga.de/ Name: __gads
Value: ID=9ccf265ca3b6372e:T=1575024778:S=ALNI_MbW-jJ-zP6B4ohenVFh1hQvFpT_jg
.giga.de/ Name: _gat_gt1
Value: 1
.m6r.eu/ Name: adx
Value: 2019-11-29T10%3A52%3A57.901Z
www.giga.de/ Name: lux_uid
Value: 157502477762420808
.m6r.eu/ Name: test
Value: true
.giga.de/ Name: _gid
Value: GA1.2.1763856413.1575024778
.giga.de/ Name: pc
Value: 1
www.giga.de/ Name: AWSELB
Value: E3417B491473CBC1A013199F961D4B7989B16A0E783847BDDA9E5ECC978319D414C32B66989097610EE27A8B5DECF6E3CAAD4AFA02BE985C8AA076339656C22D8DCBE20A12
.giga.de/ Name: _ga
Value: GA1.2.2066417258.1575024778
.m6r.eu/ Name: id
Value: 8e42fa81c29be05c5f7ce632548bc697
www.giga.de/ Name: smb-session
Value: direct-1-default
.giga.de/ Name: ioam2018
Value: 0016be785940a1b0f5de0f889:1604832777637:1575024777637:.giga.de:2:giga:giga_home:noevent:1575024777637:lblhq5
www.giga.de/ Name: session_id
Value: 5a188121-c40a-49b3-a3d3-4934f6bb2e84
www.giga.de/ Name: variantATest
Value: 1

3 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://cdn.taboola.com/libtrc/unip/1092206/tfa.js(Line 3)
Message:
Taboola Pixel: An error occurred while handling command '{"notify":"event","name":"page_view","id":1092206,"tim":1575024777861}'. TypeError: Cannot read property 'getItem' of null
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.

ad.doubleclick.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
bbcdn-bbnaut.ibillboard.com
boot.pubstack.io
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.doubleverify.com
cdn.emetriq.de
cdn.m6r.eu
cdn.prod.pubstack.io
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cdn3.doubleverify.com
confiant-integrations.global.ssl.fastly.net
cx.atdmt.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
ff.doubleclick.net
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
hgc-cf-cache-1.svonm.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb21.s400.meetrics.net
maxcdn.bootstrapcdn.com
nugmw.userreport.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sak.userreport.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
t.nativendo.de
teaser.giga.de
templates.stroeerdigital.de
tpc.googlesyndication.com
tps.doubleverify.com
tps20233.doubleverify.com
track.adform.net
tracking.m6r.eu
ups.xplosion.de
uss.xplosion.de
videos.giga.de
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.gstatic.com
xpl.theadex.com
104.89.16.215
107.178.241.34
108.128.71.27
109.71.25.30
13.224.196.116
13.225.78.101
136.243.4.81
143.204.101.52
143.204.101.90
148.251.47.137
151.101.13.194
151.101.14.2
151.101.14.217
161.156.66.178
172.217.22.34
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
188.40.16.106
2001:4de0:ac19::1:b:1b
213.254.244.18
216.58.205.230
23.209.84.82
2600:9000:20eb:ae00:15:efbc:e300:93a1
2600:9000:2156:1200:1f:a1b:34c0:93a1
2600:9000:2156:5400:1c:8c89:a300:93a1
2600:9000:21f3:7000:19:fc2c:a140:93a1
2600:9000:21f3:bc00:12:6213:9cc0:93a1
2606:4700:20::681a:5fb
2a00:1450:4001:809::2002
2a00:1450:4001:80b::2006
2a00:1450:4001:816::200a
2a00:1450:4001:817::200a
2a00:1450:4001:81b::200e
2a00:1450:4001:820::2001
2a00:1450:4001:820::2003
2a02:26f0:eb:181::5f76
2a03:2880:f01c:8004:face:b00c:0:8c
2a03:2880:f11c:8183:face:b00c:0:25de
3.122.213.19
34.252.231.90
34.95.76.218
35.156.29.62
35.186.238.175
37.157.4.39
46.253.113.178
46.4.69.14
52.19.202.254
52.219.72.199
52.222.171.40
52.57.208.4
62.168.44.118
63.34.92.224
89.163.159.125
89.163.159.99
91.215.103.64
91.215.103.65
95.100.145.49
95.100.146.26
01660e42aa0e71721c0c50e15188cf158060cb7f15c4a656bfec83831c88201a
03b07f320a1692a2d507465027fffaa6560d19d248c33bb6a5f2c97b75680c1d
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04e81f322b084bc3e471a66f436f202253fb8adfa80f935f083f933d5604e64b
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0ae97947e61f3cfbc533be423ba1bbd7080d5b17758fb5b09fb9de383daa31a7
0b2be83508587d5bc8714c5f635d33b518a3df13b16da58fd8e4c433a0639149
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0e838acd19fb2161149a1790c00a15758f89b7dde0270bfb9b76dfcdf38503a0
0e946b0ee0337cf23c845f67a238e1fefd5f1e014fdbd8ea27870172fcedd40f
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
13e3a7ad5a995b446b7d7bbe43dc427ab5a62cad611246fcbbc3331f2270e821
1400b120f0ab181fc389dfec74a7b3a6e470b379b2af0d0dd2efecba974f940e
1412d7245072504d1975da264074e475485b5bab1edab58938a536542a4f3dd5
16849c854b667fd47bade33fd9ea96fbc8f0442aaba63488cd4db8198af2cacb
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1c70c2c2279a48f9ee6d62deb5f0f9c8ccfac78c9143dfcdcae7b4b570a440f0
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
23f5a3eca6fec1f8380dd45a87da65ee9ab4c93d4602403dc26b18e2afeb201f
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
30558167fd1e13d3bf5f971ab8905491d9eceabfc2c40651e4665ea8e62541d7
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5
466ad4346ce936aca54d8e30d30f4a3b6890280581344a35a2ec48cb787a2c40
47086c8a936615260e00f2a6371ff2ca0105df1dc07ceaa892a12308667b6c9a
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c
514362d7c95dc5ff23b5b20119b60bf93f339baf3a0c619dcea70ca6ae0abf7e
5213cdacb0f7cb4d1e62a7968adf19303eb3fe7c43f9e53f9af148e62c51ae79
5246644be6089cd84b624b1a21bd706846595d40af34d13a9d43534bceaff106
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
5d5056a2f20fa890a19b411ba27b663c848b0298db4968030b3b9aae09577047
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
5fa6833aaa4245a425c0bf047e200f7be29f46246239529a6e4ac8085736671d
6136ebd39cee2065813b9b7ac99b696af62cbb7c36cb4b0dd1cfd829e32dc74c
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93
6dd3895f5ada4228659707ea320d4e24bc6552bc6cf3422fb47d9d346968c1eb
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
79ce82d4c778ade37fe234dacef1da7f0b510c5140bab394ed9faf6495c64c91
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8579026504b16f72bc28feaf090cf853f72bc22c7544bc31abbc41892f2e504c
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef
8a639873531a8b6008faa79685ff27e35eff2e990b5906732b94716410aa96f3
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8db624e21c35d3f1626601a61acb544d8dc307f820c325f945d4a2b60cb2c2eb
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
90ab883e2b560a45b57e19331a777123f10d4d78244d4ae1b51b633dac52112c
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9b5c44c4cc85e8d4e2046eb571d8107621cb66dcc57f116c4a968c4790b6bc95
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a1ad3328e8716939b8757c810bf2f37f2240058fc934ef266472d2fc1968742e
a9cc3aa5da89c156ec96838148a04d96c95e9345ba63cad4022b71a435f34348
aa930d29e912acca34c296dad4be163ebd7c6af142d902e9f8d50a1d963233cc
aacfa0a8589dfcd298c605fc1751cdc9f6b809c2ab898aeb03c2ca8812e0a853
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aebdd9a915b4ef4a02e8644990e22ac80caf8e0252db1a40b5879f628d64f6ff
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221
b07e3b49fda5c92931231c98eaf53f279523b7f0aafc074820ff3bad386ef134
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53
b4241bfaca95e8bcc8bd5cbee914cfc5426e99906f1f63bf85722edb3e03f1e7
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c0919be94ee30d4a66f3f1f9061960460d80605864389bc3507e6c1881def51d
c2d54d2b322b479adf343ee743a1f066b70085e4adb5a51d7c103ed957dcb986
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c96da1b2936da5850abf3281eb0e3b5eedf57a92ce7de42704d500d7a2a7ad6b
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d4353cb2ae6ea7a42c4b32e3bd4551548a6f5490553f4043b2b3d6430c2a6140
d479ead5caf0180533e3533bd099c70218619589a7fae0e5ab7415c1e781aaea
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d9a75729ca40f061dff3a36b6dae2a1cc1d9ebc5d6d2f83ec08a89a982178c3c
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc201720e1ce31148e4e5c66702ba5a5c56b66e245fae60306f1b1ca75369e2e
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
de27e88a210352f52e35cecc1521b83b2d5b9a59a17ca1e9973d6faff87b09e9
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
e055bed894d6c01fc4aafb80c53922728a5dbf80d1b09ae1dc796433f757c369
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
e8c918d8ae1a508aa0589554736f8ebe1830ebb9b5a3469da8d46ed7ad229450
ebf4f635a17d10d6eb46ba680b70142419aa3220f228001a036d311a22ee9d2a
ed3c54809d4c4db85864c8abfe2779cdfbcdad2ce1a5ca6db98105e98ee8ae35
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
eef4a15c3052aafe48e802c56cbe67a693f3492dd091bc83b75cb87cae857ae9
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f2627d56fad12cefb399d0578c9f3c4ad45eba9cd72cc173bc85c366a925a276
f39f343e54ceca709e31ef90afc42e5388bd34a8693ab98d15d65f7b1575d079
ff844e8444ab91d7c856416a23357c452b5eccae2ab3f2bf533ea7eceeada2d3