Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On November 07 via manual from DE

Summary

This website contacted 52 IPs in 9 countries across 38 domains to perform 213 HTTP transactions. The main IP is 2a00:13c8:f5::f:4b3d:148, located in Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust TLS RSA CA G1 on July 29th 2019. Valid for: a year.
This is the only time www.golem.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
3 77 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
6 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
9 2a00:1450:400... 15169 (GOOGLE)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
16 172.217.23.162 15169 (GOOGLE)
1 13.224.196.46 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
3 8 104.109.82.87 20940 (AKAMAI-ASN1)
1 1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:204... 16509 (AMAZON-02)
7 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
5 2a00:1450:400... 15169 (GOOGLE)
1 37.157.6.252 198622 (ADFORM)
10 136.243.2.136 24940 (HETZNER-AS)
3 7 2.18.234.72 16625 (AKAMAI-AS)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 95.216.194.18 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
3 148.251.131.173 24940 (HETZNER-AS)
1 2600:9000:20e... 16509 (AMAZON-02)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
8 2a00:1450:400... 15169 (GOOGLE)
2 151.101.13.194 54113 (FASTLY)
1 3 2a00:1450:400... 15169 (GOOGLE)
2 52.216.108.77 16509 (AMAZON-02)
1 3 89.163.159.109 24961 (MYLOC-AS)
3 148.251.69.233 24940 (HETZNER-AS)
2 2 52.48.102.50 16509 (AMAZON-02)
1 1 136.243.12.39 24940 (HETZNER-AS)
2 2 37.157.2.234 198622 (ADFORM)
6 188.40.115.112 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 3.121.36.175 16509 (AMAZON-02)
3 13.224.196.120 16509 (AMAZON-02)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
1 185.33.223.209 29990 (ASN-APPNEXUS)
1 1 172.217.21.194 15169 (GOOGLE)
1 2.16.122.151 20940 (AKAMAI-ASN1)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.28.163.57 16509 (AMAZON-02)
2 5.9.158.18 24940 (HETZNER-AS)
1 136.243.94.77 24940 (HETZNER-AS)
1 13.224.196.105 16509 (AMAZON-02)
1 62.168.44.118 5588 (GTSCE GTS...)
4 54.246.164.155 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 85.114.144.106 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 108.128.71.27 16509 (AMAZON-02)
213 52
Apex Domain
Subdomains
Transfer
96 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.3.damoh.golem.de
ssl.1.damoh.golem.de
2 MB
24 doubleclick.net
securepubads.g.doubleclick.net
ff.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
315 KB
16 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
157 KB
10 meetrics.net
lb7.s400.meetrics.net
3 KB
9 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
7 selfcampaign.com
lib.selfcampaign.com
delivery.selfcampaign.com
track2.selfcampaign.com
track.selfcampaign.com
6 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
6 adscale.de
ih.adscale.de
js.adscale.de
8 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
27 KB
4 googletagservices.com
www.googletagservices.com
115 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 google-analytics.com
www.google-analytics.com
18 KB
3 adform.net
adx.adform.net
c1.adform.net
871 B
3 google.nl
adservice.google.nl
1 KB
3 ioam.de
script.ioam.de
de.ioam.de
13 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 yieldlove-ad-serving.net
tracking.yieldlove-ad-serving.net
214 B
2 googleapis.com
imasdk.googleapis.com
93 KB
2 adsrvr.org
match.adsrvr.org
909 B
2 amazonaws.com
s3.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
20 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
531 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 stroeerdigital.de
templates.stroeerdigital.de
1 KB
1 2mdn.net
s0.2mdn.net
11 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 adnxs.com
ib.adnxs.com
590 B
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 googletagmanager.com
www.googletagmanager.com
27 KB
1 google.com
adservice.google.com
718 B
1 nuggad.net
si.nuggad.net
540 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
87 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
61 KB
213 38
Domain Requested by
75 www.golem.de 1 redirects www.golem.de
cdn.stroeerdigitalgroup.de
16 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb7.s400.meetrics.net www.golem.de
8 tpc.googlesyndication.com securepubads.g.doubleclick.net
tpc.googlesyndication.com
8 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
8 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
7 video.golem.de www.golem.de
text
6 tt.onthe.io cdn.onthe.io
6 cpxl.golem.de www.golem.de
5 ih.adscale.de 3 redirects www.golem.de
js.adscale.de
5 googleads.g.doubleclick.net pagead2.googlesyndication.com
4 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 track2.selfcampaign.com www.golem.de
3 www.google-analytics.com 1 redirects www.googletagmanager.com
www.golem.de
3 adservice.google.nl securepubads.g.doubleclick.net
2 uss.xplosion.de www.golem.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 ssl.3.damoh.golem.de text
2 tracking.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 dmp.theadex.com lib.selfcampaign.com
cdn.stroeerdigitalgroup.de
2 s3.amazonaws.com www.golem.de
text
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 lib.selfcampaign.com www.golem.de
2 de.ioam.de 1 redirects www.golem.de
2 ads.golem.de www.golem.de
2 golem.de 2 redirects
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 sak.userreport.com nugmw.userreport.com
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 templates.stroeerdigital.de cdn.stroeerdigitalgroup.de
1 ssl.1.damoh.golem.de text
1 s0.2mdn.net imasdk.googleapis.com
1 ad.yieldlab.net www.golem.de
1 cm.g.doubleclick.net 1 redirects
1 ib.adnxs.com www.golem.de
1 cdn.radiantmediatechs.com www.golem.de
1 d.agkn.com js.agkn.com
1 stats.g.doubleclick.net www.golem.de
1 track.selfcampaign.com 1 redirects
1 delivery.selfcampaign.com lib.selfcampaign.com
1 cpx.golem.de www.golem.de
1 js.agkn.com cdn.stroeerdigitalgroup.de
1 www.googletagmanager.com www.golem.de
1 cdn.onthe.io www.golem.de
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 adx.adform.net cdn-a.yieldlove.com
1 ff.doubleclick.net securepubads.g.doubleclick.net
1 adservice.google.com securepubads.g.doubleclick.net
1 nugmw.userreport.com www.golem.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
213 64
Subject Issuer Validity Valid
*.golem.de
GeoTrust TLS RSA CA G1
2019-07-29 -
2020-09-26
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years 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
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
*.google.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
*.selfcampaign.com
Starfield Secure Certificate Authority - G2
2018-06-28 -
2020-07-28
2 years crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-10-10 -
2020-01-02
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-02
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2019-03-19 -
2020-03-19
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.googleapis.com
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
tracking.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-10-31 -
2020-01-29
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-10-16 -
2020-01-14
3 months crt.sh
templates.stroeerdigital.de
Amazon
2019-06-26 -
2020-07-26
a year 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
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 20 frames:

Primary Page: https://www.golem.de/
Frame ID: C10E7AFCB44E00FEE645D3B93C88142E
Requests: 185 HTTP requests in this frame

Frame: https://ff.doubleclick.net/tag/js/fetch_frame_2019103101.html
Frame ID: 04E7D15B09202215063906A0E4FB4509
Requests: 1 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&dt=1573119894680&bpp=7&bdt=238&fdt=85&idt=86&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&correlator=1985937427234&frm=20&pv=2&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=42993778368&dssz=39&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3926&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=1&uci=a!1&fsb=1&xpc=AAcPAsZgR7&p=https%3A//www.golem.de&dtd=98
Frame ID: 9B56CDCC913959D6B1112317CE7DA735
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1573119894&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573119894814&bpp=4&bdt=372&fdt=4&idt=4&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=847311852863168&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=4&uci=a!4&fsb=1&dtd=10
Frame ID: 49F72E51E3DD831538212010060B634C
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894687&bpp=5&bdt=245&fdt=212&idt=212&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3099111666548416&dssz=51&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4720&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&fsb=1&xpc=OUm6dDnSuc&p=https%3A//www.golem.de&dtd=216
Frame ID: 7C17641D648D976B669D263937DED7D7
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=8893189029&adk=2659791103&adf=700606410&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894692&bpp=3&bdt=250&fdt=249&idt=249&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0%2C680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3389247411257024&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=5396&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&fsb=1&xpc=BUTml2DeWY&p=https%3A//www.golem.de&dtd=252
Frame ID: F1C468B7FCE70E5A2E799DFB167D0202
Requests: 1 HTTP requests in this frame

Frame: https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Frame ID: 500196D7287326F4B3AF37469F2E8948
Requests: 1 HTTP requests in this frame

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

Frame: https://imasdk.googleapis.com/js/core/bridge3.348.2_de.html
Frame ID: 57A33BBD51499C050B6B3C072EECE9B6
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Frame ID: F228431593C1F3D7FAF552119AA2A418
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Frame ID: 2773CF937AFADF05387035DC41F8C4D2
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvTiHVBjM54M3Am1A6vFCuQGwT8fUh5Gd1vhfZDaUP6V3xhqEr7cgEFHUB5wP4OguBMDp-8MRrIuVBZgpBHOQr2gI9PnaJyQc5ePDpp7sq7n7Lz4o-YNmPQjAsx0LnyWFZVRTDt-cxS8mDEdG0biWM1MASpZ6yQpnqo0zCArs0iabPs8OeaRyGVaJhK7N4tMOj357T-arptMw81JjPuk3zTisPKwAeEssalWT_mZ-6ry-5DGxZYw9zhwS-YihQ6-QABXqdMXGpZQrQrlObMn9mTPdaXGg&sig=Cg0ArKJSzOmaUhQ7uQjTEAE&urlfix=1&adurl=
Frame ID: 2671C4C9E0F09308B13DBEFD9E424C16
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuj9AncVgX6zdDfUacjZ1Q-kmVbxS22iIVbkH-QAyhR4FWkFCQbQLuK6JXE2ORomrzzgWx_UFo_zUKU4gBKRljd7uC7pzrD5PlyGgCtAY6rdQ-YiV-6FWKQaDlknkOyGKiUuuWXJJga6QAUDxZ4Y58xQy2jgtmFdSHX0ocxLIrEhmvadzI6K8izUgZXOv4zgAivZHDxP1-MRQlV45FWP75kFL9C5rqFErG0jowupYEx9nSQ2SgEERLP-kxeoI9phA1kYBgvsyFic3Y-WAambqMktyhl&sig=Cg0ArKJSzC3Ty5w8fCa2EAE&urlfix=1&adurl=
Frame ID: 3D098D36B02EFE8C9994FA47D8128906
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvimbgutvQYV58NiYEca5mI7du6jl11NdBFa3uSlnNqgFDjT-bNnJJ5ZZSzb5rzFuc9C9rjRS5fh4pEnXcveueL7sSU2Ao-lBZV468CNJSKSKiSoePg6iSuUqw6yC6_0C2rcI_1NFzIIMwm8ziybv-CRmVTgLU5YR3R27Dmve3UZEy9GaP1lhgkUq1Qe4JM58blRnjL-yto3mXZbFdg0wzKS9RpPf4MWHZ485Xjputh1Ewuqufz_T0kuUU4aAXsKNv7QvfJ-7Oy1ovBmvX4iWcRn6b3&sig=Cg0ArKJSzP5hVpEGqp0qEAE&urlfix=1&adurl=
Frame ID: BBFE743AC2BCE8AF81C0CE927E51A09C
Requests: 12 HTTP requests in this frame

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

Frame: https://tpc.googlesyndication.com/sodar/sodar2/204/runner.html
Frame ID: F4B197FE13724146B6413527BE9DAB0A
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=d85696fc2f284caca01ce4f70504c34d
Frame ID: 70C27661BBCCFA1F57A6EBA7379E7112
Requests: 1 HTTP requests in this frame

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

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

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

Page Statistics

213
Requests

100 %
HTTPS

38 %
IPv6

38
Domains

64
Subdomains

52
IPs

9
Countries

3041 kB
Transfer

5919 kB
Size

2
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://golem.de/ HTTP 301
    https://golem.de/ HTTP 301
    http://www.golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 26
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 27
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Request Chain 54
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&id=wapd74&i3=001bde05d6baf21685dc3e796%3A1604483094784%3A1573119894784%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1573119894784&n1=2&dntt=0&lt=1573119894785&ev=&cs=x9ookg&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&id=wapd74&i3=001bde05d6baf21685dc3e796%3A1604483094784%3A1573119894784%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1573119894784&n1=2&dntt=0&lt=1573119894785&ev=&cs=x9ookg&mo=1&sr=71
Request Chain 126
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=412e45caefb475d118d5286ba494f356 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=412e45caefb475d118d5286ba494f356 HTTP 302
  • https://track.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7
Request Chain 127
  • https://c1.adform.net/serving/cookie/match?party=1173 HTTP 302
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=3128463282270943296&source=adform
Request Chain 136
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=223273292&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=IAhAAUAB~&jid=195446591&gjid=846466305&cid=148876803.1573119895&tid=UA-518800-2&_gid=872064876.1573119895&_r=1&gtm=2ouav3&z=2121847944 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=148876803.1573119895&jid=195446591&_gid=872064876.1573119895&gjid=846466305&_v=j79&z=2121847944
Request Chain 144
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=3caf9559c7017d8f5306fa8053af5311&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D3caf9559c7017d8f5306fa8053af5311%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=3caf9559c7017d8f5306fa8053af5311&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D3caf9559c7017d8f5306fa8053af5311%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=6ec3dd0f0cef47758989d3283a1fe5d6 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=3caf9559c7017d8f5306fa8053af5311&userId=adscale-user:6ec3dd0f0cef47758989d3283a1fe5d6
Request Chain 145
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=3caf9559c7017d8f5306fa8053af5311
Request Chain 146
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=PK-VWccBfY9TBvqAU69TEQ HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 147
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=3caf9559c7017d8f5306fa8053af5311
Request Chain 215
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=d85696fc2f284caca01ce4f70504c34d
Request Chain 221
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsU-ESJZESB8BsUkWsfABifABSfABSfABifABifABfrr&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=4208873600093318133

213 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://golem.de/
  • http://www.golem.de/
  • https://www.golem.de/
186 KB
43 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8653d5ec4c1d0492ab620a5ce53bc6caaa9b678fd387577fba693d6dc37355d6
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

Request headers

Host
www.golem.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/78.0.3904.70 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
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/78.0.3904.70 Safari/537.36

Response headers

Server
nginx
Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_78; expires=Thu, 07-Nov-2019 21:44:54 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-03ad5ee1fd88f86608dbc2a3a4eac34a"
Content-Encoding
gzip
Vary
Accept-Encoding
X-UPSTREAM
unix:/var/run/php-fpm-www.sock

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_130-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_130-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Wed, 05 Jun 2019 18:13:08 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
249 KB
61 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
48093f593e770d92ca7ec2afafc2afa5c20da1b35cb115bfb5bd86d95fa4e8fe

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
vary
Accept-Encoding
x-amz-request-id
A9A3FE67F04111C1
status
200
content-length
61717
x-amz-id-2
2IGrinkMwlO1qEKNqsvyuuHHeL44hDjkhXd/7SeeLsWHw8bKjWDqmhVt4eTu/LoMnpXubziawPk=
last-modified
Thu, 07 Nov 2019 09:30:28 GMT
server
KONICHIWA/1.0
etag
"cc1f50822e86b626b409ac6c37aec55f"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=704
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144837-213549-213547_rc.jpg
www.golem.de/1911/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1911/144837-213549-213547_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e801417c99f2df504d727ca0c5072faffab528da26538ddf029e0bd32a342710

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 08:16:04 GMT
Server
nginx
ETag
"5dc3d2c4-57b0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22448
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144836-213570-213567_rc.jpg
www.golem.de/1911/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/144836-213570-213567_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1f7d025e04209fddeb26e9bb7682439b215b5d60939785e128848d077314844e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 06:39:03 GMT
Server
nginx
ETag
"5dc3bc07-1731"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5937
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144845-213590-213587_rc.jpg
www.golem.de/1911/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1911/144845-213590-213587_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
52005312e3adc941a2cfc6009e224e3dd017f53e7436650cb342100d144e6acb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 09:42:03 GMT
Server
nginx
ETag
"5dc3e6eb-135f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4959
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144792-213330-213327_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144792-213330-213327_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
434ef8f99f72547ad8fa9c22e5a61ba85b2752419ce609ad9a616f8202ff33b7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 08:00:03 GMT
Server
nginx
ETag
"5dc3cf03-1a89"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6793
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144849-213607-213604_rc.jpg
www.golem.de/1911/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/144849-213607-213604_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
68016130d233fb0238abe9d334b2cabced1896ee66a19ddcc38212ffe4acb3af

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 09:35:03 GMT
Server
nginx
ETag
"5dc3e547-18b0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6320
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144821-213471-213468_rc.jpg
www.golem.de/1911/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144821-213471-213468_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7bea6aef5347ca91dee24d09ae637f13cb96be4a41071b1abf970a7fed938d05

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 14:00:04 GMT
Server
nginx
ETag
"5dc2d1e4-19ed"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6637
Expires
Sun, 08 Dec 2019 09:44:54 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1573119541&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
799
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
notfalltest-des-starliner-boeing.jpg
video.golem.de/teaser/1/1/23736/thumb-high-1000/
52 KB
52 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23736/thumb-high-1000/notfalltest-des-starliner-boeing.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4c3c8ac4998d395f04020c25d76a71146d53bff0192426705641e347e49480e1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 04 Nov 2019 15:57:29 GMT
Server
nginx
ETag
"5dc04a69-ce52"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
52818
Expires
Sun, 08 Dec 2019 09:44:54 GMT
project-silica-microsoft-research.jpg
video.golem.de/teaser/1/1/23739/thumb-high-1000/
69 KB
70 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23739/thumb-high-1000/project-silica-microsoft-research.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f970caa6d45b0638848d1da199ead274a467879ea0ac4a16a5056c3925062782

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 10:37:40 GMT
Server
nginx
ETag
"5dc150f4-1152d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
70957
Expires
Sun, 08 Dec 2019 09:44:54 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1573118642&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
798
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
144739-213077-213074_rc.jpg
www.golem.de/1911/
98 KB
99 KB
Image
General
Full URL
https://www.golem.de/1911/144739-213077-213074_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
26dd08941fee81cf194d1a8fc023a00c89e87337c246d772191eae7053fea8a5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 04 Nov 2019 08:05:04 GMT
Server
nginx
ETag
"5dbfdbb0-189c7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
100807
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144396-212904-212903_rc.jpg
www.golem.de/1911/
119 KB
119 KB
Image
General
Full URL
https://www.golem.de/1911/144396-212904-212903_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3bc72d32aafe9690f879735e846215810846b9a942c38e0f9de8c280ba69eb43

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 11:03:03 GMT
Server
nginx
ETag
"5dc2a867-1dcb2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
122034
Expires
Sun, 08 Dec 2019 09:44:54 GMT
190708-golem_Akademie_Frame.jpg
www.golem.de/_img/
110 KB
110 KB
Image
General
Full URL
https://www.golem.de/_img/190708-golem_Akademie_Frame.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1ae6ee501f2db1d64f9878b6abb03e3ca476df7651c92bff9cf443ec5edf0d3c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 08 Jul 2019 15:14:07 GMT
Server
nginx
ETag
"5d235dbf-1b7ff"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
112639
Expires
Sun, 08 Dec 2019 09:44:54 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
longread-swiper_133-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Wed, 23 Oct 2019 17:02:13 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
576 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
unix:/var/run/php-fpm-www.sock
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 26 Jul 1997 05:00:00 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
102 KB
37 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
b2dd5346518af23577e1fad81876a5f57ef1516282b9b3190f5696663ed9e55c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
37325
x-xss-protection
0
server
cafe
etag
12358455328682424956
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Thu, 07 Nov 2019 09:44:54 GMT
golem_csi-133-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Wed, 30 Oct 2019 21:07:56 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sdcv.js
ads.golem.de/
63 B
402 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Sun, 08 Dec 2019 09:44:54 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 001b
Resource Hash
f76d18045710dcd31bf1674f3b02db59a42b80136f3b1ed06f00105d982c4a74

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 001b
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Thu, 07 Nov 2019 11:44:54 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
90fdc8d121b1f4a0d5b4035387b90148bdd6839cfa47a03aca4735bddacaa078
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"329 / 797 of 1000 / last-modified: 1573085616"
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15550
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:54 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
283 KB
87 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.46 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-46.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
45ba7e6b8ac86ae14d4f9f3e29d816130cccb439f63c9a5cea16595bb4c991c4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:05:07 GMT
content-encoding
gzip
age
1459
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
A4ontMxBlH2nSqk5LhDDyCotMIJE8NlyYfmGky98rg4_mVumbjmQcA==
via
1.1 3bf3e75bcb9a86b3eb343a1d4392a6df.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Thu, 07 Nov 2019 11:44:54 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
64859de9a73bb505163d3478613f5bf01c6fc77941259bb3f6ee39b11b42a65d

Request headers

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

Response headers

Date
Thu, 07 Nov 2019 09:44:54 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.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
107

Redirect headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.golem.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/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
  • https://nugmw.userreport.com/rc-ap/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2043:2600:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cbb18993901cb5ba967785e6bf16dd0b466e28d387695cd5dbd0aac7ddf0081e

Request headers

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

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
via
1.1 b7e7cd319ec31b533acb1e9e4b737331.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA54
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
1807
x-amz-cf-id
EpMHccM3jc2qdw7Nh_BU359H-TIkaf_fRAyaPs97wyq6Lvs5aFDi0w==

Redirect headers

date
Thu, 07 Nov 2019 09:44:54 GMT
via
1.1 eb1a8c1b1275e33a016e623478052111.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
gpVagK7RTxj5kRCpkqjotoExr_pE416rO1huzp8FfT2GpricGDxNBw==
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Sun, 08 Dec 2019 09:44:54 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Sun, 08 Dec 2019 09:44:54 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Sun, 08 Dec 2019 09:44:54 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

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

Response headers

Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Sun, 08 Dec 2019 09:44:54 GMT
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
147 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

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

Response headers

Content-Type
image/svg+xml
truncated
/
768 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5

Request headers

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

Response headers

Content-Type
image/svg+xml
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-6624"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26148
Expires
Sun, 08 Dec 2019 09:44:54 GMT
btn-follow-sp4b.png
www.golem.de/staticrl/images/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4b.png
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 08 Apr 2019 18:48:10 GMT
Server
nginx
ETag
"5cab976a-b0e"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Sun, 08 Dec 2019 09:44:54 GMT
gx-ads.js
ads.golem.de/track.ads/
226 B
566 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=9518689017714558&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Sun, 08 Dec 2019 09:44:54 GMT
integrator.js
adservice.google.nl/adsid/
109 B
718 B
Script
General
Full URL
https://adservice.google.nl/adsid/integrator.js?domain=www.golem.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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
718 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.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:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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_2019103101.js
securepubads.g.doubleclick.net/gpt/
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59272
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:54 GMT
fetch_frame_2019103101.html
ff.doubleclick.net/tag/js/ Frame 04E7
0
0
Document
General
Full URL
https://ff.doubleclick.net/tag/js/fetch_frame_2019103101.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_2019103101.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
6667
date
Thu, 07 Nov 2019 09:05:56 GMT
expires
Fri, 06 Nov 2020 09:05:56 GMT
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
2338
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/
222 KB
84 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
2de5e612c77760fbeeca70349af2f79e74fa83e8486e9bde43ed44146aa6c801
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
85730
x-xss-protection
0
server
cafe
etag
5565536152327483927
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 07 Nov 2019 09:44:54 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191105/r20190131/ Frame 4024
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191105/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20191105/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 05 Nov 2019 16:00:04 GMT
expires
Tue, 19 Nov 2019 16:00:04 GMT
content-type
text/html; charset=UTF-8
etag
8648543205226238674
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7402
x-xss-protection
0
cache-control
public, max-age=1209600
age
150290
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
/
adx.adform.net/adx/
10 B
408 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPTZiN2FjNDkzLTJhZTMtNDQzYS04ZjI5LWVmY2QxNGQwYjE3MA%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPTYxMmZmN2VlLTNiM2EtNDRkNS05ODljLTIwNjRmZWYxM2RlYQ%3D%3D&pt=gross&stid=bb5b7eff-ff8c-4bb6-8978-a0627ac55972&fd=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.252 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
s1.adform.net
Software
nginx /
Resource Hash
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:54 GMT
server
nginx
status
200
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
content-length
10
expires
-1
submit
lb7.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb7.s400.meetrics.net/bb-mx/submit?/w/CqBHAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSL6CPAAAAAAAAAOAAAAGCAAAAAAZwSL6CBRksFAQtjF1v5qSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Thu, 07 Nov 2019 09:44:53 GMT
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqCIAAATkzFARksFAQtjFbrJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:53 GMT
nuggad
ih.adscale.de/
49 B
482 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=5&d4=6&d11=0&d8=1&d9=2&d12=1&d1=1&d3=2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 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
Thu, 07 Nov 2019 09:44:54 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Tue, 22 Oct 2019 07:34:44 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Fri, 08 Nov 2019 09:44:54 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 9B56
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&dt=1573119894680&bpp=7&bdt=238&fdt=85&idt=86&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&correlator=1985937427234&frm=20&pv=2&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=42993778368&dssz=39&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3926&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=1&uci=a!1&fsb=1&xpc=AAcPAsZgR7&p=https%3A//www.golem.de&dtd=98
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&dt=1573119894680&bpp=7&bdt=238&fdt=85&idt=86&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&correlator=1985937427234&frm=20&pv=2&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=42993778368&dssz=39&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3926&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=1&uci=a!1&fsb=1&xpc=AAcPAsZgR7&p=https%3A//www.golem.de&dtd=98
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Thu, 07 Nov 2019 09:44:54 GMT
server
cafe
content-length
25888
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 07-Nov-2019 09:59:54 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
expires
Thu, 07 Nov 2019 09:44:54 GMT
cache-control
private
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: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5cec58c4f5aa27aa79be6149814da34bec2b96e6049ffa30df37b69598f789ff
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572872426893709"
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-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
29288
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:54 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&i...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&i...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&id=wapd74&i3=001bde05d6baf21685dc3e796%3A1604483094784%3A1573119894784%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1573119894784&n1=2&dntt=0&lt=1573119894785&ev=&cs=x9ookg&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.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 / BLACKBIRD-RCV v1.05.0 0034
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0034
Transfer-Encoding
chunked
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
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0034
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
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=001b&i2=001bde05d6baf21685dc3e796&ep=1598141290&vr=415&id=wapd74&i3=001bde05d6baf21685dc3e796%3A1604483094784%3A1573119894784%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1573119894784&n1=2&dntt=0&lt=1573119894785&ev=&cs=x9ookg&mo=1&sr=71
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
Wed, 07 Nov 2018 09:44:54 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
72 KB
27 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.194.18 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.18.194.216.95.clients.your-server.de
Software
nginx /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:32:02 GMT
Server
nginx
ETag
W/"5c7d1ac2-11e36"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Mon, 28 Oct 2019 10:40:49 GMT
js
www.googletagmanager.com/gtag/
73 KB
27 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
b32616aef40b25240a40cfebe9a815caa57fb8164147bd964a0a91e56596a4a3
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
br
last-modified
Thu, 07 Nov 2019 09:00:00 GMT
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-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
27628
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:54 GMT
146005_67aa4bdf07fc8a6dd839add1ec7302a1
lib.selfcampaign.com/tag/
10 KB
4 KB
Script
General
Full URL
https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
e526543ee894a2f4179f55e57f6a7ef6f20de3c25b350c9257d8a99c1790829d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
nginx/1.14.0 (Ubuntu)
Transfer-Encoding
chunked
Content-Type
text/javascript; charset=utf-8
X-Request-Id
354cd063-3a69-47ba-8dba-c342f672693c
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Connection
keep-alive
Vary
Accept-Encoding
X-XSS-Protection
1; mode=block
X-Runtime
0.021599
Expires
Fri, 01 Jan 1990 00:00:00 GMT
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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:1e00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 00:50:56 GMT
via
1.1 e0efba8a72628bfc3dc6d4d637b28302.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
34107
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
yE-iBpoVzf9GKDtpw-MRDHuhA8I_sc3qf_HBE4IXMSDTe8hOJdMysQ==
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
bd-snap.jpg
video.golem.de/teaser/1/1/23728/thumb-high-1000/
132 KB
132 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23728/thumb-high-1000/bd-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
04803ea62250e5b6be046376bf3ce7c7a288af79b157497b563f083d076985b4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Sun, 03 Nov 2019 13:30:31 GMT
Server
nginx
ETag
"5dbed677-20ffc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
135164
Expires
Sun, 08 Dec 2019 09:44:54 GMT
2019-11-01(1).jpg
video.golem.de/teaser/1/1/23721/thumb-high-1000/
109 KB
109 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23721/thumb-high-1000/2019-11-01(1).jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
01c3e7f83d0dcbcb8efeb5730d85a7472b182415004852e96ad9995faaf625fc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Fri, 01 Nov 2019 18:25:43 GMT
Server
nginx
ETag
"5dbc78a7-1b3a9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
111529
Expires
Sun, 08 Dec 2019 09:44:54 GMT
pscam-snap.jpg
video.golem.de/teaser/1/1/23737/thumb-high-1000/
107 KB
107 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23737/thumb-high-1000/pscam-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
62899a9c2ff2c26a31bffc73ced6ae508f6e48b980151d6276d39e8e4993cf74

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 02:50:51 GMT
Server
nginx
ETag
"5dc0e38b-1aa7e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
109182
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144824-213484-213483_rc.jpg
www.golem.de/1911/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1911/144824-213484-213483_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
14f1e5cd3945b27cef93055ecd0a2c3434ad517859f7454ebd99f51169021af8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 07:42:02 GMT
Server
nginx
ETag
"5dc2794a-122b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4651
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144844-213586-213585_rc.jpg
www.golem.de/1911/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/144844-213586-213585_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1f7ea44014a85a60e4807e506aef94fef3d3b1fc98f61574afd16057c49a04f2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 09:00:03 GMT
Server
nginx
ETag
"5dc3dd13-15eb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5611
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144843-213581-213575_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144843-213581-213575_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0766772b73649dee975dfbf6899d42eb7bef326ba870a679b5a1f5522dda03da

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 07:53:03 GMT
Server
nginx
ETag
"5dc3cd5f-1b3b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6971
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144823-213482-213479_rc.jpg
www.golem.de/1911/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1911/144823-213482-213479_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
07b8ab33ab9d0a52b9bf08de9aeaa40920e6d979c62c954490538dcdb0df6bc4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 06:46:03 GMT
Server
nginx
ETag
"5dc26c2b-22be"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8894
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144842-213574-213571_rc.jpg
www.golem.de/1911/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144842-213574-213571_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e33a0b1fbdf9a8edb2c4c400894fc263a5393cf8923bea786b9fa63703a892fd

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 07:38:03 GMT
Server
nginx
ETag
"5dc3c9db-19ff"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6655
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144776-213266-213262_rc.jpg
www.golem.de/1911/
123 KB
123 KB
Image
General
Full URL
https://www.golem.de/1911/144776-213266-213262_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f164b867ddfc48b4a9998907412aff4dfa4eeee4a3383d12bc8546b4d0fca65a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 04 Nov 2019 11:05:04 GMT
Server
nginx
ETag
"5dc005e0-1eac8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
125640
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144831-213517-213514_rc.jpg
www.golem.de/1911/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/144831-213517-213514_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
420d78da234773b0c3e1d796a128d03a4a5570f583901a1d865fdd81c50a3f9b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 12:00:05 GMT
Server
nginx
ETag
"5dc2b5c5-1813"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6163
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144819-213461-213458_rc.jpg
www.golem.de/1911/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1911/144819-213461-213458_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
184bc3ef67282b95f8efea3032c6865ed299929a575859205cdf029385b9f4a4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 17:59:03 GMT
Server
nginx
ETag
"5dc1b867-21b5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8629
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144841-213561-213558_rc.jpg
www.golem.de/1911/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1911/144841-213561-213558_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
345bf169855f7a59f691910a42ae7b8be1dc7006cefac23c631b59e941c9b85c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 16:36:03 GMT
Server
nginx
ETag
"5dc2f673-270f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9999
Expires
Sun, 08 Dec 2019 09:44:54 GMT
142005-205491-205487_rc.jpg
www.golem.de/1911/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/142005-205491-205487_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cf100d861ec596ebd57dccbc2ba486f3c2dcc6bed24fd32c0a8838c48e50ad1e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 11:06:04 GMT
Server
nginx
ETag
"5dc1579c-161e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5662
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144839-213541-213538_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144839-213541-213538_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7331d395483bd9c25ea43aa19dd5cbbe39f440106a449a8fc6dc59fcc4fe3e25

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 15:30:03 GMT
Server
nginx
ETag
"5dc2e6fb-1b26"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6950
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144838-213537-213534_rc.jpg
www.golem.de/1911/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1911/144838-213537-213534_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
127e7d6844c8f9fbff9d755d3b1722a81202d0c21511c8baace4ccf9c62b6a09

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 15:15:03 GMT
Server
nginx
ETag
"5dc2e377-25bc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9660
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144835-213533-213530_rc.jpg
www.golem.de/1911/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1911/144835-213533-213530_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
dbae19bf269f2cdd505927b2726c6347e86b1d6c168d0383d6d9e50add0edfac

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 14:15:03 GMT
Server
nginx
ETag
"5dc2d567-1dba"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7610
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144834-213529-213526_rc.jpg
www.golem.de/1911/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1911/144834-213529-213526_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
925893649edac6748f0cdd793483050add4533bc18839e92017949dc83062cdb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 12:29:03 GMT
Server
nginx
ETag
"5dc2bc8f-1d3b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7483
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144833-213525-213522_rc.jpg
www.golem.de/1911/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1911/144833-213525-213522_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a13785025557c4cfb5b9fe089b482cde5686fad03ce5ef829f9467d6df12152a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 12:15:03 GMT
Server
nginx
ETag
"5dc2b947-2522"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9506
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144722-213326-213323_rc.jpg
www.golem.de/1911/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1911/144722-213326-213323_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ed0571a6b86d59f69e0551fb4f9f1b5cad7b7aa610f02a53f65722c25aecc160

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 06:00:03 GMT
Server
nginx
ETag
"5dc10fe3-233b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9019
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144806-213397-213394_rc.jpg
www.golem.de/1911/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144806-213397-213394_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bd595d15b14166de468948af0212265857b924966c2bfcbb52a83413d6070fcf

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 12:00:05 GMT
Server
nginx
ETag
"5dc2b5c5-19c4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6596
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144832-213521-213518_rc.jpg
www.golem.de/1911/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1911/144832-213521-213518_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e10f6bf3d2922089aa0bff2c9494003e3d7ba803f2e3602ca43fae72b854884c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 11:30:03 GMT
Server
nginx
ETag
"5dc2aebb-222f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8751
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144828-213505-213502_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144828-213505-213502_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
525334785b998bc7826f462d6d361ac8f1337af6226f8460fa5ec6a349ec4369

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 10:53:03 GMT
Server
nginx
ETag
"5dc2a60f-1b96"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7062
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144830-213509-213506_rc.jpg
www.golem.de/1911/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1911/144830-213509-213506_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1e84c821b9ab797d576cad0f30d1d9fca9f860b034900df6f4851c8bde15229c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 10:42:03 GMT
Server
nginx
ETag
"5dc2a37b-224a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8778
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144829-213513-213510_rc.jpg
www.golem.de/1911/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144829-213513-213510_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
12ae952d6e680bfa2fcc28d2aa1d0e2acbd064c13da4d8e6d5adb47faa0559e6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 10:30:03 GMT
Server
nginx
ETag
"5dc2a0ab-18f4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6388
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144826-213496-213492_rc.jpg
www.golem.de/1911/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1911/144826-213496-213492_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7facf44fcbf3a15175fcaf8453940a674944d11c5f79c37f0e3b644de6108ad3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 10:17:03 GMT
Server
nginx
ETag
"5dc29d9f-266a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9834
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144827-213500-213497_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144827-213500-213497_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ebe15d4a3d57846d0ab5443a1b9957ee909b6d4bbc9c20fa33feedff0db3dde7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 09:53:03 GMT
Server
nginx
ETag
"5dc297ff-1be7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7143
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144825-213491-213488_rc.jpg
www.golem.de/1911/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1911/144825-213491-213488_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f7553762e3767d4d7b902733e48ecc5c08077e386bd5e5c20734f090309bdeda

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 06 Nov 2019 09:40:03 GMT
Server
nginx
ETag
"5dc294f3-184c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6220
Expires
Sun, 08 Dec 2019 09:44:54 GMT
144778-213299-213296_rc.jpg
www.golem.de/1911/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1911/144778-213299-213296_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac44428fc2414ce9fc40136bb9ec50345431c5ef7b21937b5e100974ef0ebd78

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 05 Nov 2019 09:03:04 GMT
Server
nginx
ETag
"5dc13ac8-1ad4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6868
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144266-211165-211163_rc.jpg
www.golem.de/1911/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1911/sp_144266-211165-211163_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a49776f75ec24fc397ba3e9b0478d2f9e3634bb9deed79e7b814f94eb0a84718

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Fri, 01 Nov 2019 09:00:04 GMT
Server
nginx
ETag
"5dbbf414-63c5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
25541
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144740-213085-213083_rc.jpg
www.golem.de/1911/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1911/sp_144740-213085-213083_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ecc50ee94e3e8c8057a22f8e131d4bb53e9add15df28aab399907816b2215b71

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Fri, 01 Nov 2019 07:02:04 GMT
Server
nginx
ETag
"5dbbd86c-56c9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22217
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144752-213146-213143_rc.jpg
www.golem.de/1911/
13 KB
13 KB
Image
General
Full URL
https://www.golem.de/1911/sp_144752-213146-213143_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a9d362a8027789758b13c8f43484c36ad0b365a438bce7edad85ee44e5da72a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Fri, 01 Nov 2019 13:01:37 GMT
Server
nginx
ETag
"5dbc2cb1-3268"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
12904
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144711-212954-212952_rc.jpg
www.golem.de/1910/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144711-212954-212952_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2f501b3d97d523fb7428b009ada5d4937b24fc2b8eee7660a12098717f071e4d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 31 Oct 2019 08:12:06 GMT
Server
nginx
ETag
"5dba9756-52eb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21227
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144682-212763-212760_rc.jpg
www.golem.de/1910/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144682-212763-212760_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bd26854a1183bb91b20374fd40531a4ec844f36ac69064696f365a6ba08647a4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 31 Oct 2019 11:03:05 GMT
Server
nginx
ETag
"5dbabf69-407a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16506
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144658-212691-212689_rc.jpg
www.golem.de/1910/
31 KB
31 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144658-212691-212689_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c40da849aadb5b2bd0f5069f679021aa321ffcf3f8c5007c2ab9233016367101

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 30 Oct 2019 08:19:04 GMT
Server
nginx
ETag
"5db94778-7aa5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
31397
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144652-213072-213070_rc.jpg
www.golem.de/1910/
15 KB
16 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144652-213072-213070_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
168d5766d6ec1781d7bb7a8d59ef7683ded35400339f04f72352654acba7eab6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 31 Oct 2019 15:23:05 GMT
Server
nginx
ETag
"5dbafc59-3d41"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15681
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144686-212907-212905_rc.jpg
www.golem.de/1910/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144686-212907-212905_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
039c78ec6eac9f8df6d46011f753983b2102fe3cd6e4eb1b763097d388853d75

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Wed, 30 Oct 2019 11:16:05 GMT
Server
nginx
ETag
"5db970f5-47c7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18375
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144495-212013-212011_rc.jpg
www.golem.de/1910/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144495-212013-212011_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a93110b72125bbfdf1f2d40aaa039beaa4908f1752b6cb19ef005f4bfcedf9bf

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 28 Oct 2019 11:01:04 GMT
Server
nginx
ETag
"5db6ca70-5294"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21140
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144626-212455-212453_rc.jpg
www.golem.de/1910/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144626-212455-212453_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cc088978815c12f8d255e07052bc5eea16deb6248fea719c07e438ee1aa5e16c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 28 Oct 2019 06:00:04 GMT
Server
nginx
ETag
"5db683e4-5b18"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23320
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144582-212753-212751_rc.jpg
www.golem.de/1910/
27 KB
27 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144582-212753-212751_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
db509867424310e881a0226b260a933f9bc3a034ca53010a281e20b4f3020bf3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 29 Oct 2019 13:00:07 GMT
Server
nginx
ETag
"5db837d7-6aac"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
27308
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144669-212702-212700_rc.jpg
www.golem.de/1910/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144669-212702-212700_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e646ed57105c9937bff87823180da4052182e65d0066e1e78a16dc2d50cd4ffb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 29 Oct 2019 11:08:05 GMT
Server
nginx
ETag
"5db81d95-50d5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20693
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144579-212421-212419_rc.jpg
www.golem.de/1910/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144579-212421-212419_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6385759e7a0468a16443529573c86db7b6799a610105aca3ebb20dbb276acef5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Mon, 28 Oct 2019 08:31:05 GMT
Server
nginx
ETag
"5db6a749-6306"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
25350
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144668-212672-212670_rc.jpg
www.golem.de/1910/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144668-212672-212670_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
da784170a3525c383a522f7f09c9773525881261c1994518ed75a7fdb56fa41d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Tue, 29 Oct 2019 07:01:04 GMT
Server
nginx
ETag
"5db7e3b0-4706"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18182
Expires
Sun, 08 Dec 2019 09:44:54 GMT
sp_144482-212338-212336_rc.jpg
www.golem.de/1910/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144482-212338-212336_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe8d16cf5925e30773f6eb2467c337f28417b0e3da3c1afed4bc6fcff24992d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 24 Oct 2019 10:02:06 GMT
Server
nginx
ETag
"5db1769e-51bc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20924
Expires
Sun, 08 Dec 2019 09:44:54 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1573119895&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Last-Modified
Thu, 07 Nov 2019 09:44:54 GMT
Server
Apache
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
X-Cnection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 49F7
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1573119894&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573119894814&bpp=4&bdt=372&fdt=4&idt=4&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=847311852863168&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=4&uci=a!4&fsb=1&dtd=10
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1573119894&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573119894814&bpp=4&bdt=372&fdt=4&idt=4&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=847311852863168&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=4&uci=a!4&fsb=1&dtd=10
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Thu, 07 Nov 2019 09:44:54 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 07-Nov-2019 09:59:54 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
expires
Thu, 07 Nov 2019 09:44:54 GMT
cache-control
private
ads
securepubads.g.doubleclick.net/gampad/
389 B
802 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=519083329577244&correlator=1544402743985201&output=ldjh&impl=fifs&adsid=NT&eid=21065107%2C21062833%2C21063203%2C21064708&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191107&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D3caf9559c7017d8f5306fa8053af5311%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-1%252Cn133-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-5%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-1%252Cn107-1%252Cn21-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-0%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-1%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-2%252Cn109-0%252Cn122-2%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1573119894&dt=1573119894849&dlt=1573119894442&idt=392&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=3874908706&ucis=1&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.golem.de%2F&dssz=50&icsg=847311852863168&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=800x450&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
4fcc32abfa3753573f9e3f02ba91394bb66f8566c681ba0d42687a7abca38b1c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
196
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.golem.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_2019103101.js
securepubads.g.doubleclick.net/gpt/
64 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25134
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:54 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
60 KB
19 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=519083329577244&correlator=1544402743985201&output=ldjh&impl=fifs&adsid=NT&eid=21065107%2C21062833%2C21063203%2C21064708&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191107&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17298.default%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17295.default%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17299.default%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cas%3Dbillboard2%26adslot%3Dbillboard2%26pc%3D1%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A18494.default%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17300.default%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D3caf9559c7017d8f5306fa8053af5311%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-1%252Cn133-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-5%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-1%252Cn107-1%252Cn21-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-0%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-1%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-2%252Cn109-0%252Cn122-2%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1573119894&dt=1573119894886&dlt=1573119894442&idt=392&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adys=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adks=2242890686%2C2546325955%2C2740773112%2C366944190%2C2251274322&ucis=2%7C3%7C4%7C5%7C6&ifi=6&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=51&icsg=3099111666548416&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x0%7C1000x0%7C300x0%7C1000x0%7C300x2&msz=10x40%7C20x10%7C10x20%7C20x10%7C10x10&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&fws=128%2C128%2C128%2C128%2C128&ohw=0%2C0%2C0%2C0%2C0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
aa4eed278e2cd09fc86bc7c301a64cb8210b3d42cfb033831fa1da600c91a799
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
18856
x-xss-protection
0
google-lineitem-id
-1,-1,5194673165,4980490284,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-1,-1,138290413938,138263655552,138267872671
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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
googleads.g.doubleclick.net/pagead/ Frame 7C17
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894687&bpp=5&bdt=245&fdt=212&idt=212&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3099111666548416&dssz=51&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4720&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&fsb=1&xpc=OUm6dDnSuc&p=https%3A//www.golem.de&dtd=216
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894687&bpp=5&bdt=245&fdt=212&idt=212&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3099111666548416&dssz=51&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4720&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&fsb=1&xpc=OUm6dDnSuc&p=https%3A//www.golem.de&dtd=216
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Thu, 07 Nov 2019 09:44:55 GMT
server
cafe
content-length
27816
x-xss-protection
0
set-cookie
IDE=AHWqTUkQWCZUCunCJbJdDVD7dsMzwj6o4v_GHAvTYhMtD1LuyE2IpSVRInoyociy; expires=Tue, 01-Dec-2020 09:44:54 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
expires
Thu, 07 Nov 2019 09:44:55 GMT
cache-control
private
sp_oz76Wk-766497_rc.jpg
www.golem.de/7905/
68 B
463 B
Image
General
Full URL
https://www.golem.de/7905/sp_oz76Wk-766497_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:54 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
config.js
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
38 KB
9 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.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
34257afc86d550f106423cc3bb5ceceec8f9d2bae0e72da879b98fefc6ad9472

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Age
1731
X-Cache
HIT
Connection
keep-alive
Content-Length
8702
x-amz-id-2
r93RhoMafOHbV7Rj0frwRcasJtzuOmGf5ufTczybhzS2xhXek75Hcz2OWnMM7wQgD+LCk/moZk8=
X-Served-By
cache-fra19147-FRA
Last-Modified
Thu, 07 Nov 2019 09:02:26 GMT
Server
AmazonS3
X-Timer
S1573119895.985238,VS0,VE0
ETag
"521d04034f7139da00b844c9870a7682"
x-amz-request-id
25A6F1D35D7BE68E
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
81
rmpslider-rl_133-min.js
www.golem.de/staticrl/scripts/radiant/
21 KB
9 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_133-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 07 Nov 2019 09:44:54 GMT
Content-Encoding
gzip
Last-Modified
Wed, 23 Oct 2019 17:33:40 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:54 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame F1C4
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=8893189029&adk=2659791103&adf=700606410&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894692&bpp=3&bdt=250&fdt=249&idt=249&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0%2C680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3389247411257024&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=5396&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&fsb=1&xpc=BUTml2DeWY&p=https%3A//www.golem.de&dtd=252
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191105/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=8893189029&adk=2659791103&adf=700606410&w=680&lmt=1573119894&rafmt=11&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1573119894692&bpp=3&bdt=250&fdt=249&idt=249&shv=r20191105&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C0x0%2C680x150&nras=1&correlator=1985937427234&frm=20&pv=1&ga_vid=148876803.1573119895&ga_sid=1573119895&ga_hid=223273292&ga_fc=0&iag=0&icsg=3389247411257024&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=5396&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031%2C21064708%2C42631002&oid=3&pvsid=519083329577244&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=3&uci=a!3&fsb=1&xpc=BUTml2DeWY&p=https%3A//www.golem.de&dtd=252
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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Thu, 07 Nov 2019 09:44:55 GMT
server
cafe
content-length
27980
x-xss-protection
0
set-cookie
IDE=AHWqTUlUv8qiAwSBch_y889EmgUrYLrsGeA-YxNGEj-DijHt5TMC1W6yXJSva0Q-; expires=Tue, 01-Dec-2020 09:44:54 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
expires
Thu, 07 Nov 2019 09:44:55 GMT
cache-control
private
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
796
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
795
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
794
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
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.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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
3029
date
Thu, 07 Nov 2019 08:54:25 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Thu, 07 Nov 2019 10:54:25 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.108.77 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:56 GMT
Last-Modified
Thu, 07 Nov 2019 05:13:11 GMT
Server
AmazonS3
x-amz-request-id
2EDEBF77126A34DF
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
V/SX1RN4+ZUV8v0AdBKdT+WgTYBCUZw/HEOFp8zhY8/DswApC+XZiBkYCxGA3B7Ig9AGZGfS0DA=
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:55 GMT
Cookie set frame
delivery.selfcampaign.com/tag/146005/ Frame 5001
0
0
Document
General
Full URL
https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Host
delivery.selfcampaign.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
_auid=412e45caefb475d118d5286ba494f356
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Thu, 07 Nov 2019 09:44:55 GMT
Content-Type
text/html; charset=utf-8
Transfer-Encoding
chunked
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Content-Type-Options
nosniff
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Pragma
no-cache
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Vary
Accept-Encoding
Content-Encoding
gzip
Set-Cookie
_session_id=3cfa2bbdc5aa49ee3be90ade39f34817; path=/; HttpOnly
X-Request-Id
07f8c12b-6005-49ec-b7cb-221588408125
X-Runtime
0.010686
adex.js
dmp.theadex.com/d/506/3014/s/
36 KB
13 KB
Script
General
Full URL
https://dmp.theadex.com/d/506/3014/s/adex.js
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.109 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
last-modified
Tue, 11 Jun 2019 18:16:05 GMT
server
nginx
etag
W/"5cffefe5-90b2"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 07 Nov 2019 09:49:55 GMT
/
track2.selfcampaign.com/tag/
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/tag/?request_id=354cd063-3a69-47ba-8dba-c342f672693c&_auid=412e45caefb475d118d5286ba494f356&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=412e45caefb475d118d5286ba494f356
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=412e45caefb475d118d5286ba494f356
  • https://track.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7
  • https://track2.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Location
https://track2.selfcampaign.com/map_td/?tdid=c6310fb7-cbf4-4bac-af7c-9adca31a6cc7
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx/1.6.2
Connection
keep-alive
Content-Length
160
Content-Type
text/html
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=1173
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173
  • https://track2.selfcampaign.com/map_td/?tdid=3128463282270943296&source=adform
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=3128463282270943296&source=adform
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
server
nginx
status
302
location
https://track2.selfcampaign.com/map_td/?tdid=3128463282270943296&source=adform
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-length
0
expires
-1
mark
lib.selfcampaign.com/tag/146005/
0
0
Image
General
Full URL
https://lib.selfcampaign.com/tag/146005/mark?t=1573119895
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F78.0.3904.70%20Safari%2F537.36,device:desktop,browser_version:Other%2078,browser:Other,depth:1,user_type:new,user_id:5e4e1c411.5bef7e1aa_1573119895034,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1573119895038
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
514 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=7&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=5e4e1c411.5bef7e1aa_1573119895034&1573119895038
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F78.0.3904.70%20Safari%2F537.36,device:desktop,browser_version:Other%2078,browser:Other,depth:1,user_type:new,user_id:5e4e1c411.5bef7e1aa_1573119895034,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=5e4e1c411.5bef7e1aa_1573119895034&1573119895040
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F78.0.3904.70%20Safari%2F537.36,device:desktop,browser_version:Other%2078,browser:Other,depth:1,user_type:new,user_id:5e4e1c411.5bef7e1aa_1573119895034,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1573119895042
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n116=0&n104=0&n15=1&n155=1&n133=1&n106=1&n52=2&n153=1&n11=1&n120=3&n154=1&n125=1&n8=5&n137=0&n101=1&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=1&n107=1&n21=1&n117=2&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=1&n126=1&n92=1&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=0&n12=6&n141=0&n157=1&n99=1&n128=2&n118=3&n85=0&n9=0&n6=1&n63=0&n38=2&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=3&n90=1&n43=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=1&n91=0&n46=1&n114=1&n69=0&n10=1&n3=1&n82=1&n84=0&n5=2&n109=0&n122=2&n67=0&n115=1&n89=2&n123=2&n17=1&n78=0&n44=1&n81=1&n88=0&n39=1&n156=1&n148=0
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c643cc4a9cea1ea968d7a0b00c588136de6c13eb7049512d5dd0c26dad4acf5e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 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
1516
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
28 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Content-Encoding
gzip
Age
672
X-Cache
HIT
Connection
keep-alive
Content-Length
10727
x-amz-id-2
AmADXxslGV9+mE9ujebgWUccxUdcDd8tLtSxRkTB2OIvcXtXMv51IwxcNKh1TGcgaiSLE1BwU34=
X-Served-By
cache-fra19147-FRA
Last-Modified
Thu, 17 Oct 2019 18:13:36 GMT
Server
AmazonS3
X-Timer
S1573119895.068896,VS0,VE0
ETag
"084deea6f314d94436d69a233e4af5e3"
x-amz-request-id
317AFB2B8E1D42CE
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
842
gen_204
pagead2.googlesyndication.com/pagead/
0
124 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=resize&scrl=0&adk=106988496&adf=2993371392&fmt=680x150&str=true&ad_y=3876&vph=1200&r_nw=680&r_nh=140&r_str=safe&r_ao=false&r_rqtr=dnsz_init&qid=CIXrkqTo1-UCFZrDuwgd4nYHhg&r_ifr=true&r_cab=true&w=680&h=150&nw=680&nh=140&rsz=%7C%7CeE%7C&abl=CS&frsz=false&err=0&url=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=223273292&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=148876803.1573119895&jid=195446591&_gid=872064876.1573119895&gjid=846466305&_v=j79&z=2121847944
35 B
103 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=148876803.1573119895&jid=195446591&_gid=872064876.1573119895&gjid=846466305&_v=j79&z=2121847944
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c00::9c Brussels, Belgium, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
date
Thu, 07 Nov 2019 09:44:55 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-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

Redirect headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=148876803.1573119895&jid=195446591&_gid=872064876.1573119895&gjid=846466305&_v=j79&z=2121847944
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
414
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=223273292&t=timing&_s=2&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&utc=JS%20Dependencies&utv=load&utt=531&_u=IAhAAUAB~&jid=&gjid=&cid=148876803.1573119895&tid=UA-518800-2&_gid=872064876.1573119895&gtm=2ouav3&z=12579356
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 29 Oct 2019 23:38:06 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
727609
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
sp_oz76Wk-175974_rc.jpg
www.golem.de/9317/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/9317/ad-time/sp_oz76Wk-175974_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
sp_oz76Wk-730818_rc.jpg
www.golem.de/6982/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/6982/ad-time/sp_oz76Wk-730818_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
Cookie set /
d.agkn.com/iframe/8613/ Frame 796B
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=553356288&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.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
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.121.36.175 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-121-36-175.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Thu, 07 Nov 2019 09:44:54 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%3A0qGgnSPNN5%2BYL8YMZNlAUYUF9xOxM6e2;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlVqQXJVakFwAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
1001 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:22 GMT
Via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
51
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
0zoXEvJVFALnG1h35B8nc9APBHmvEjDgdyNzpZoPHetbG1TfNd1TLA==
Expires
0
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
5 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=436977
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:2cd , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
564aea40bd7c495ca78015c65ff916ef761d0c5a294d15ad46c3a1cb214c73f4
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
2667
cf-ray
531e5f10f95fcbc8-VIE
status
200
last-modified
Wed, 06 Nov 2019 04:16:09 GMT
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/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=3600
timing-allow-origin
*
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Thu, 07 Nov 2019 10:44:55 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 08 Dec 2019 09:44:55 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=3caf9559c7017d8f5306fa8053af5311&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D3caf9559c7017d8f5306fa8053af5311%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=3caf9559c7017d8f5306fa8053af5311&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D3caf9559c7017d8f5306fa8053af5311%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=3caf9559c7017d8f5306fa8053af5311&userId=adscale-user:6ec3dd0f0cef47758989d3283a1fe5d6
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=3caf9559c7017d8f5306fa8053af5311&userId=adscale-user:6ec3dd0f0cef47758989d3283a1fe5d6
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=3caf9559c7017d8f5306fa8053af5311&userId=adscale-user:6ec3dd0f0cef47758989d3283a1fe5d6
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Thu, 07 Nov 2019 09:44:55 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=3caf9559c7017d8f5306fa8053af5311
0
590 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=3caf9559c7017d8f5306fa8053af5311
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:57 GMT
X-Proxy-Origin
109.236.94.21; 109.236.94.21; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.154:80
AN-X-Request-Uuid
129acbfa-e453-4200-809e-4819e8e5a3cd
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=3caf9559c7017d8f5306fa8053af5311
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
98
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=PK-VWccBfY9TBvqAU69TEQ
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
server
HTTP server (unknown)
status
302
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"
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
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
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=3caf9559c7017d8f5306fa8053af5311
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=3caf9559c7017d8f5306fa8053af5311
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Wed, 06 Nov 2019 09:44:55 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=3caf9559c7017d8f5306fa8053af5311
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
99
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
ima3.js
imasdk.googleapis.com/js/sdkloader/
273 KB
93 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
08d851026bab1d4b8c1e46b8713c9a5821f7c5dcfd058735f9e036aac5197553
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 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
94730
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

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

Response headers

Content-Type
image/png
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

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

Response headers

Content-Type
image/png
truncated
/
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

Request headers

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

Response headers

Content-Type
image/png
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Sun, 08 Dec 2019 09:44:55 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Sun, 08 Dec 2019 09:44:55 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
207 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=EXtrQPGDfO
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
d92031b829c213036fbe7137f1ce5c8bd69ef1e3af6797c75e5a697c321b9e73

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C1
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 07 Nov 2019 09:41:59 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
dpFszWP7125Wv7jSaPwuaaz-EYe5fwPAYbCsNfhl8T6_KF7r5jj5_A==
gen_204
pagead2.googlesyndication.com/pagead/
0
59 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=resize&scrl=0&adk=2659791103&adf=700606410&fmt=680x150&str=true&ad_y=5366&vph=1200&r_nw=680&r_nh=140&r_str=safe&r_ao=false&r_rqtr=dnsz_init&qid=CLSCnaTo1-UCFavGuwgdoB8OsQ&r_ifr=true&r_cab=true&w=680&h=150&nw=680&nh=140&rsz=%7C%7CeE%7C&abl=CS&frsz=false&err=0&url=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
59 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=resize&scrl=0&adk=2940155785&adf=3103571475&fmt=680x150&str=true&ad_y=4659.5&vph=1200&r_nw=680&r_nh=140&r_str=safe&r_ao=false&r_rqtr=dnsz_init&qid=CP28mqTo1-UCFZPHuwgd7eIAtA&r_ifr=true&r_cab=true&w=680&h=150&nw=680&nh=140&rsz=%7C%7CeE%7C&abl=CS&frsz=false&err=0&url=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:55 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-44b"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Sun, 08 Dec 2019 09:44:55 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-39c"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Sun, 08 Dec 2019 09:44:55 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=5e4e1c411.5bef7e1aa_1573119895034&1573119895302
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:55 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
bridge3.348.2_de.html
imasdk.googleapis.com/js/core/ Frame 57A3
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.348.2_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200a 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
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.348.2_de.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
194889
date
Thu, 07 Nov 2019 07:00:21 GMT
expires
Fri, 06 Nov 2020 07:00:21 GMT
last-modified
Tue, 05 Nov 2019 18:55:51 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
9874
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
client.js
s0.2mdn.net/instream/video/
26 KB
11 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 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
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
10523
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
truncated
/
207 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d92031b829c213036fbe7137f1ce5c8bd69ef1e3af6797c75e5a697c321b9e73

Request headers

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

Response headers

Content-Type
text/javascript
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame F228
0
0
Document
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_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-36/html/container.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3516
date
Thu, 07 Nov 2019 09:00:27 GMT
expires
Fri, 06 Nov 2020 09:00:27 GMT
last-modified
Wed, 16 Oct 2019 15:42:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
2668
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
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/ Frame 2773
0
0
Document
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_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-36/html/container.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3516
date
Thu, 07 Nov 2019 09:00:27 GMT
expires
Fri, 06 Nov 2020 09:00:27 GMT
last-modified
Wed, 16 Oct 2019 15:42:04 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
2668
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
view
securepubads.g.doubleclick.net/pcs/ Frame 2671
0
76 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvTiHVBjM54M3Am1A6vFCuQGwT8fUh5Gd1vhfZDaUP6V3xhqEr7cgEFHUB5wP4OguBMDp-8MRrIuVBZgpBHOQr2gI9PnaJyQc5ePDpp7sq7n7Lz4o-YNmPQjAsx0LnyWFZVRTDt-cxS8mDEdG0biWM1MASpZ6yQpnqo0zCArs0iabPs8OeaRyGVaJhK7N4tMOj357T-arptMw81JjPuk3zTisPKwAeEssalWT_mZ-6ry-5DGxZYw9zhwS-YihQ6-QABXqdMXGpZQrQrlObMn9mTPdaXGg&sig=Cg0ArKJSzOmaUhQ7uQjTEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:55 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-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 2671
76 KB
28 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
cd3aaeda7bcb688b7912aa6ba9d502b2654eda372431f343f4f4b3fa04838b97
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572872426893709"
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-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
29099
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
imgad
tpc.googlesyndication.com/pagead/ Frame 2671
24 KB
25 KB
Image
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDnm4Oh2QEQARgBMgitfI9gey4F2g
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 05 Nov 2019 11:15:31 GMT
x-content-type-options
nosniff
server
cafe
age
167364
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/jpeg
status
200
cache-control
public, max-age=604800
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
24989
x-xss-protection
0
expires
Tue, 12 Nov 2019 11:15:31 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3D09
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuj9AncVgX6zdDfUacjZ1Q-kmVbxS22iIVbkH-QAyhR4FWkFCQbQLuK6JXE2ORomrzzgWx_UFo_zUKU4gBKRljd7uC7pzrD5PlyGgCtAY6rdQ-YiV-6FWKQaDlknkOyGKiUuuWXJJga6QAUDxZ4Y58xQy2jgtmFdSHX0ocxLIrEhmvadzI6K8izUgZXOv4zgAivZHDxP1-MRQlV45FWP75kFL9C5rqFErG0jowupYEx9nSQ2SgEERLP-kxeoI9phA1kYBgvsyFic3Y-WAambqMktyhl&sig=Cg0ArKJSzC3Ty5w8fCa2EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:55 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-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
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 3D09
51 KB
15 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
90fdc8d121b1f4a0d5b4035387b90148bdd6839cfa47a03aca4735bddacaa078
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"329 / 910 of 1000 / last-modified: 1573085616"
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15550
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3D09
76 KB
28 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
cd3aaeda7bcb688b7912aa6ba9d502b2654eda372431f343f4f4b3fa04838b97
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572872426893709"
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-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
29099
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame BBFE
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvimbgutvQYV58NiYEca5mI7du6jl11NdBFa3uSlnNqgFDjT-bNnJJ5ZZSzb5rzFuc9C9rjRS5fh4pEnXcveueL7sSU2Ao-lBZV468CNJSKSKiSoePg6iSuUqw6yC6_0C2rcI_1NFzIIMwm8ziybv-CRmVTgLU5YR3R27Dmve3UZEy9GaP1lhgkUq1Qe4JM58blRnjL-yto3mXZbFdg0wzKS9RpPf4MWHZ485Xjputh1Ewuqufz_T0kuUU4aAXsKNv7QvfJ-7Oy1ovBmvX4iWcRn6b3&sig=Cg0ArKJSzP5hVpEGqp0qEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:55 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-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
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame BBFE
51 KB
15 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
90fdc8d121b1f4a0d5b4035387b90148bdd6839cfa47a03aca4735bddacaa078
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"329 / 770 of 1000 / last-modified: 1573085616"
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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15550
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame BBFE
76 KB
28 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
cd3aaeda7bcb688b7912aa6ba9d502b2654eda372431f343f4f4b3fa04838b97
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1572872426893709"
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-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
29099
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

status
200
date
Thu, 07 Nov 2019 09:59:02 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

status
200
date
Thu, 07 Nov 2019 09:59:02 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
truncated
/ Frame 2671
218 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
03cc398bea70db2f6624fddd0412aeb8b70ed203ef2a48af1c7a57230e419525

Request headers

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

Response headers

Content-Type
image/png
pubads_impl_2019103101.js
securepubads.g.doubleclick.net/gpt/ Frame 3D09
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59272
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
integrator.sync.js
adservice.google.nl/adsid/ Frame 3D09
113 B
179 B
Script
General
Full URL
https://adservice.google.nl/adsid/integrator.sync.js?domain=www.golem.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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
108
x-xss-protection
0
pubads_impl_2019103101.js
securepubads.g.doubleclick.net/gpt/ Frame BBFE
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59272
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:55 GMT
integrator.sync.js
adservice.google.nl/adsid/ Frame BBFE
113 B
176 B
Script
General
Full URL
https://adservice.google.nl/adsid/integrator.sync.js?domain=www.golem.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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
108
x-xss-protection
0
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=1695153984
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.108.77 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:56 GMT
Last-Modified
Thu, 07 Nov 2019 05:13:11 GMT
Server
AmazonS3
x-amz-request-id
F3C920C2EAB21509
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
hUJA2BUlTEfUGa17KhdFCd01RcVc6SDW+jfevHUWf3IPSleOxh/NEh9PhAYXO414Mi73+uRQBzI=
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php?cache=8031922944
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
1001 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=9341268624
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:22 GMT
Via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
51
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
SxUewPt5wxCp1zen8sU8ziqZpbPUhkZDxMoKhgHoXQNGM8ObbAF95Q==
Expires
0
ads
securepubads.g.doubleclick.net/gampad/ Frame 3D09
296 B
200 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3952166953917181&correlator=1320842494577456&output=ldjh&impl=fif&eid=21064169%2C21065034&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191107&iu=%2F53015287%2Fgolem.de_d_970x250_4_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32&scp=adslot%3Dbillboard2%26src%3Dsdg%26yieldlove_pid%3D18494%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522billboard2%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522f10x1%2522%255D%252C%2522as%2522%253A%255B%2522billboard2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522billboard2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%25223caf9559c7017d8f5306fa8053af5311%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-0%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n133-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n22-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-3%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n6-1%2522%252C%2522n63-0%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n84-0%2522%252C%2522n5-2%2522%252C%2522n109-0%2522%252C%2522n122-2%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-0%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252218494%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A18494.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3Dd7e9ec7f8b81bc51%3AT%3D1573119894%3AS%3DALNI_MZB0IAF-CBbG8pSkSzfbfRRGXZ4XQ&cdm=www.golem.de&bc=31&abxe=1&lmt=1573119895&dt=1573119895775&dlt=1573119895600&idt=168&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=251&oid=3&adx=308&ady=1596&adk=2408324468&uci=yq8lmi91gbdx&ifi=1&ifk=1555408520&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&ga_vid=148876803.1573119895&ga_sid=1573119896&ga_hid=1824025441&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
2a7e6fc006450b14245184f4a75379a30fa24f91859346a9774223ddb286d644
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
122
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.golem.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_2019103101.js
securepubads.g.doubleclick.net/gpt/ Frame 3D09
64 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame BBFE
300 B
206 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1268103029909341&correlator=549246396396356&output=ldjh&impl=fifs&eid=21065106%2C21062832%2C21064679%2C21064709&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A268435456%2C2%3A268435456%2C8%3A268435456&sc=1&sfv=1-0-36&ecs=20191107&iu_parts=53015287%2Cgolem.de_d_300x250_2_dc&enc_prev_ius=%2F0%2F1&prev_iu_szs=10x10%7C301x250%7C300x126%7C34x32&prev_scp=adslot%3Drectangle2%26src%3Dsdg%26yieldlove_pid%3D17300%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle2%2522%255D%252C%2522af%2522%253A%255B%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%25223caf9559c7017d8f5306fa8053af5311%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-0%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n133-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n22-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-3%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n6-1%2522%252C%2522n63-0%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n84-0%2522%252C%2522n5-2%2522%252C%2522n109-0%2522%252C%2522n122-2%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-0%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217300%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17300.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3Dd7e9ec7f8b81bc51%3AT%3D1573119894%3AS%3DALNI_MZB0IAF-CBbG8pSkSzfbfRRGXZ4XQ&cdm=www.golem.de&bc=31&abxe=1&lmt=1573119895&dt=1573119895788&dlt=1573119895606&idt=175&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adxs=993&adys=4443&adks=4008869679&ucis=767mafcljg29&ifi=1&ifk=4200391111&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&ga_vid=148876803.1573119895&ga_sid=1573119896&ga_hid=1212421632&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
63682dd2c3752c64430139f625703b0031902e4d136e4a09e3d7c53e9c389631
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:55 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-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
128
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.golem.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_2019103101.js
securepubads.g.doubleclick.net/gpt/ Frame BBFE
64 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

/
ssl.3.damoh.golem.de/8ae06340fb0f11afd33a3ce6002f7286f483511b/
311 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.golem.de/8ae06340fb0f11afd33a3ce6002f7286f483511b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.158.18 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.18.158.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 07 Nov 2019 09:44:56 GMT
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:57 GMT
Server
AmazonS3
Etag
"d6efb72fc51c297f7098e2b1c92794c5"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.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
de6-homad-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
truncated
/ Frame 3D09
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7bfb787459e6f1e03a5b06ba9bfd3b72245b901d540f2b672d1c52ca3aee4f4d

Request headers

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

Response headers

Content-Type
image/png
truncated
/ Frame BBFE
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6046fc054dcedf23fc53f963107611fd97b73fd214d69e53591cb9c1120966a6

Request headers

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

Response headers

Content-Type
image/png
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.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:55 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqDsUAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A3zAxxA54A50Ay1A11EyzE1sFvzFx1BvBF/k0FhEmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A51A21A3BELlnFBUkzF2BPeBAAZAwSAcAAAAP7MAAAAAAABVSmAPCAAFAAVSmTYeNAPAAAhPAEQABYeNAZCAAOA55A55A85B55A58E55A55AGAx1A24AyxArYeNAP0AAhPAEQAHYeNASksF8FjAAAAAAAAAAAAEAAAVSmAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4ExyA1BEMAxzA4yA5wA0xAz5Az4AGAkpFylFj0FAAAAJAx0A15A12A33A1BEKA1xA50A23AzxA21AJAylFj0FhuFnsFlBFKA1xA50A23AzxA21AKA1xA50A23AzxA21A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAEQAsEA9BAFAAAYeNAAAAARA4tB1uFruFv3FutBzwAw4ExyA1BEAAAAAAAAAAAAAAAAQtjFH7D3UA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:56 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:55 GMT
sodar
pagead2.googlesyndication.com/getconfig/ Frame BBFE
6 KB
6 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2019103101&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
564355608ada6e39d57fde85f6a5b270b21d555ea31d68e67bc4776bc3ba1ca5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 07 Nov 2019 09:44:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
5072
x-xss-protection
0
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqEKVAA/k0FDJmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A51A21A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw1A4BELlnFCUkzFYBPbFAAAAAAAB8fVAPEAAFAA8fVThRjAPAAAAAAAAABhRjAZEAAOA55A55A85B55A58E55A55AFA44Aw2AwBErhRjASksF8FjAAAAAAAAAAAAEAAA8fVAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdAAAAAAAAAAAAFAAAhRjAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFQLHyWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:56 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:55 GMT
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqFMVAA/k0FrNmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A51A21A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw1A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw4A4BELlnFDTkzFARksFAQtjF7W3zWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:56 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:55 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.94.77 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.77.94.243.136.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:56 GMT
Last-Modified
Wed, 24 Apr 2019 07:48:14 GMT
Server
openresty/1.15.8.2
ETag
"5cc014be-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame BD18
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
da4d0c64526408b9def0eb9b67e7f0c06d5831a02e4cb52c2481f9925dd80677

Request headers

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

Response headers

Content-Type
text/javascript
sodar2.js
tpc.googlesyndication.com/sodar/ Frame BBFE
13 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0ae091d6b529a28c0080dd4e376a97d1c246a0d9187095ef0242168b5d09d74b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570551776720363"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5395
x-xss-protection
0
expires
Thu, 07 Nov 2019 09:44:56 GMT
/
ssl.3.damoh.golem.de/11ae91eed17cdec8464069c17f210aaa6a900e4f/
110 B
670 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/11ae91eed17cdec8464069c17f210aaa6a900e4f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGRhaVhlZXBpa2VlVHVuZ2U9ZGFpWGVlcGlrZWVUdW5nZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guWWV8fCh4LlllPTApO3guWWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5ZZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1MJiYoTCgpLEw9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5xbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5CYyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EubWYoYyk7YS5odShsKTthLmd1KG0pO2EuVHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLk5iLmxlbmd0aCl7dmFyIGE9bC5OYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXY9dGhpcy5hWzNdO3RoaXMuYnA9dGhpcy5hWzRdO3RoaXMuaWw9dGhpcy5hWzddO3RoaXMuT2s9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVsyXTt0aGlzLlhtPXRoaXMuYVs5XTt0aGlzLmxwPXRoaXMuYVs0XTt0aGlzLndyPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs5XX1jLkpyPWI7Yi5wcm90b3R5cGU9e0R2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fdjp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYnA6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuTmsoYSl9LE5rOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuT2s6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpwOnRoaXMuV20oYSl9LFdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YbTp0aGlzLmtwKGEpfSxrcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndyOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGlhPWMuSnJ8fGlhLHNjPW5ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLkR2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnFvPSExO3RoaXMuR2I9InNldHVwIjt0aGlzLlFjPVtdO3RoaXMucWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudnQuYmluZCh0aGlzKSk7dGhpcy5wYj17fTt0aGlzLlZnPXt9O3RoaXMuamY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtRdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LGFjOmZ1bmN0aW9uKCl7dGhpcy5qZnx8KHRoaXMuamY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmpmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuVmdbYV0mJih0aGlzLlZnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuUXUoKSwhMCkpfSxxZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0scm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LHZ0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnV0KGEuZGF0YSl9LHV0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGplOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLkxlKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmCihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LHBuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMud2EoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5icShhKSlyZXR1cm47KGI9dGhpcy5zZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LGJxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LEFnOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0semU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxKZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0scnU6ZnVuY3Rpb24oYSxiLGQpe2EmJihhLnN0eWxlW2JdPWQpfSxvZjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD10aGlzLlhvKGIpLGY9MDtmPApkLmxlbmd0aDtmKyspdGhpcy5ydShhLGRbZl0ua2V5LGRbZl0udmFsdWUpfSx1bzpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3RyeXtyZXR1cm4gYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWNhdGNoKGIpe3JldHVybiIifX0sWG86ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI7Iik7Zm9yKHZhciBiPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGEubGVuZ3RoO3ArKyl7dmFyIGM9YVtwXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMudW8oY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2IucHVzaChkKX1yZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8KITA6ITF9LGZoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sR2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxwPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3A9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7CmY9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cCYmKGM9MTAwL3AqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLQphLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LExiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxCZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWc7eT1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmCjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHAsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxwPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYKMTUpPDwyfHA+PjYsZz1wJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihwKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sa3I6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxuZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSwKZT0hMSxnPSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlZiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksCm09KGx8fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXA7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGlqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LE1xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHpsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSwKUms6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSwkbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWkoKXx8YS5paigpfHxhLk1xKCl8fGEuemwoKXx8YS5KbSgpfHxhLlJrKCl8fGEuJGwoKX19O3JldHVybiBudWxsIT1hLmZvKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscD1hLmxlbmd0aDtmPHA7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sYmM6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sdmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0seXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LG1wOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8Yi5sZW5ndGg7cCsrKWRbYltwXV09ITA7Zm9yKHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dfHxmLnB1c2goYVtwXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEZnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5laShiKSsiOiIrdGhpcy5laShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGxmOmZ1bmN0aW9uKGEpe3RoaXMuR2I9YX0sQ2c6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5HYjt0aGlzLmdlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sRWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkNnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHAsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3AmJihCPWsuVGEoQixwKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuRWMoQil9LHh0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7amEmJihiLnNlc3Npb25faWQ9amEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMueXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuYWMoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmdlKGEpfSxnZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnh0KGEpO2lmKGIpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5NYygpO2wuQWEoYSwhMCk7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWwuTWMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwpsLkFhKGYsITApO2Y9bC5BYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtsLkxhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sT2Q6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bC5NYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1sLkFhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO2wuTGEoYSl9fSxPZTpmdW5jdGlvbigpe2wmJmwuVj9sLmlzRW5hYmxlZCYmbC5EbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHhlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5uYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sQWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LG5iOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmQoYSk6IiJ9LHJkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZmc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkllKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guaGYmJndpbmRvdy5zYW5kYm94LmhmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guaGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuQWcoYSkpcmV0dXJuIHRoaXMuQWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYmIoYSxiLkthLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLnBuKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIEY9ZXx8bDtlPSEwO2smJihlPSExKTtpZihGJiZGLlYpaWYoRi5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7Ri5BYShhLGUpO2U9Ri5BYShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIEYuTGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxGLGcsayl9LmJpbmQodGhpcyksNTAwKX0sTGU6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBsIGluIGcpZCs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW2xdKTtkPWQuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxmKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihiLGEsayksbS53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LFRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkxlKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlFjKWZvcih2YXIgYyBpbiB0aGlzLlFjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUWNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LG1oOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkthLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5UcihmLnVkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKcHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUWM9YX0sRnc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGpvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxpcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sdGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFI9Yy5ma3x8UjtuZXcgUjt2YXIgZT1uZXcgUjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMuZWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5rdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5ycz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLlBwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQXc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5TZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlhmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmFnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5mbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5WZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkx2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5RcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnB3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9nPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuVm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmpkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQmM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlpmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5obj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLiRjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5mZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZ249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmxpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IudHM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi55Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLnBnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5rdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Idj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkd2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2Iuc3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmVrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLlZpPWI7Yi5wcm90b3R5cGU9e0tzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Mczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLlZpfHxrYSx1Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD11Yy5Lcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e0JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksCmI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHVxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHFkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PQphJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMucWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5xZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmUodGhpcy5rYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLnFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphKCkrIjIifSxiaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJlKHRoaXMudXEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMucWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBLPWMuZ2t8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2k9dGhpcy5hWzddO3RoaXMuSHc9dGhpcy5hWzFdO3RoaXMuZ3Q9dGhpcy5hWzRdO3RoaXMuc3A9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuUm89YjtiLnByb3RvdHlwZT17Smk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMuR3coYSl9LEd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSHc6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd0OnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOgphfX19KShjKTt2YXIgbGE9Yy5Sb3x8bGEsdmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuSmkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLnJqPWJ9KShjKTt2YXIgTT1jLnJqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs2XTt0aGlzLndtPXRoaXMuYVsxXTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLnhzPXRoaXMuYVsxXTt0aGlzLmNzPXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLnR2PXRoaXMuYVs0XTt0aGlzLkFpPXRoaXMuYVs3XTt0aGlzLmV2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuYW09YjtiLnByb3RvdHlwZT17eHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlyOnRoaXMudm0oYSl9LHZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMud206dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnluOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54czp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3M6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5rOnRoaXMuc3YoYSl9LHN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50djp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFpOnRoaXMuZHYoYSl9LGR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuYW18fG1hLHdjPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp3Yy54cig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5KPW51bGw7dGhpcy5OYz0xMDA7dGhpcy5NYj0wO3RoaXMuV2E9MTUwO3RoaXMuUGI9MDt0aGlzLml1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5NYjw9dGhpcy5XYT8odGhpcy5NYisrLHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpOjA+dGhpcy5XYSYmKHRoaXMuUGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5OYykpfSxZdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1iPnRoaXMuV2E/ITA6ITF9LGdmOmZ1bmN0aW9uKCl7dGhpcy5NYj0wfSxVOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0saXU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sUjpmdW5jdGlvbihiKXt0aGlzLk1hW2Iua2EoKV09YjtOJiYKTi5raCYmTi5QdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS56ZSh0aGlzLk1hKX0sTzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGpyOmZ1bmN0aW9uKGIpe2I9Yi5KYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTHg6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5MbHx8dDsoZnVuY3Rpb24oYyl7Yy5ObD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk5jPTEwO3RoaXMuTWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkZiPSIiO3RoaXMudWc9ITE7dGhpcy5OKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LHR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LGx1OmZ1bmN0aW9uKGIpe3RoaXMuUmU9Yn0sc3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZX0sUWU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPD10aGlzLldhJiYodGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuTmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LElnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEVkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTng6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSXEoKXx8dGhpcy5rbigpO3RoaXMuRWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sa246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sSXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFc6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxCYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxLZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LHJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LEdoOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSx4eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRmImJihiPSEwKTtyZXR1cm4gYn0sSXg6ZnVuY3Rpb24oKXt0aGlzLnVnfHwodGhpcy51Zz0hMCl9LHdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG94OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHE9Yy5ObHx8cTsoZnVuY3Rpb24oYyl7Yy52aT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSj10aGlzLnBsYXllcj0iIjt0aGlzLk9mPSIxIjt0aGlzLlBmPSIyIjt0aGlzLlptPSIzIjt0aGlzLldjPTA7dGhpcy5waD0zMDt0aGlzLlRiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5iZz10aGlzLmhpPSExO3RoaXMuc3RhdHVzPXRoaXMuV2M7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm1mKGIpO3RoaXMuanUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5oaXx8KHRoaXMuaGk9ITAsZS5PZSgpKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlUoKTtTJiZTLmVjJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sYXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEs7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5hYygpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuYWMoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLmFjKCldPTF9LGdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEs7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLmFjKCkmJih0aGlzLm5mKCksYT0hMSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy5hcigpOwppZighdGhpcy5ncigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5uZigpO3JldHVybn10aGlzLm5mKCk7dGhpcy5KKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5haSgpO3RoaXMuYmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLGEpe3RoaXMuemEoKXx8KHRoaXMuVGIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxhaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuVGImJjA8dGhpcy5UYi5sZW5ndGgmJih0aGlzLlRiPWUudW5pcXVlKHRoaXMuVGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnJjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucmNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnJjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucmNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSx3eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJnfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5PZn0sbmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBmfSxxdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWm19LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5XY30sVWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuT2Z9LGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlBmfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5XY30sbWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYil7dGhpcy5KPWJ9LHNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSn0sWXI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnZpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFuPXRoaXMuYVs5XTt0aGlzLld2PXRoaXMuYVsxMF07dGhpcy5ydz10aGlzLmFbNV07dGhpcy5ubz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs1XX1jLnhtPWI7Yi5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Bbjp0aGlzLlZ2KGEpfSxWdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV3Y6dGhpcy5xdyhhKX0scXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubzp0aGlzLmkoYSl9LAppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2E9Yy54bXx8b2EseGM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMuem4oNCk7KGZ1bmN0aW9uKGMpe2MuSmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKVTpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5meDthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Maj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk8oYil8fCh0aGlzLlIoYiksKG5ldyBxYShiLHRoaXMuSikpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIHJhPWMuTGp8fHJhOyhuZXcgcmEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubj10aGlzLmFbM107dGhpcy56dz10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLkN2PWI7Yi5wcm90b3R5cGU9e1NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ubjp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenc6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkdsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy5Ddnx8c2EseWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9CnljLlNuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy56ZygpO3RoaXMuQmcoKTt0aGlzLlVvPSExfSx6ZzpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlcoYil9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmMpe3ZhciBiPXRoaXMuSmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmZjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuR2QoYSl9LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5HZChhKX0uYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5SZSYmKDAsdGhpcy5SZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8KInBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxCYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSx3ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMueWt8fHRhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE46ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5ZYz0hMTt0aGlzLmVlPTE7dGhpcy5aYz1bXTt0aGlzLnhiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmVlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy54Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueGI9CiEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnhiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy54Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuWWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLldlKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMuemEoKSYmKHRoaXMueGI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS5Vbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLkZiO2EmJihhLnpkKCksYS5zZSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5ZYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPgp0aGlzLnBoJiYhdGhpcy56YSgpJiYodGhpcy54Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuWmMuaW5kZXhPZihhKSYmdGhpcy5aYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnJhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuWmMubGVuZ3RoPj10aGlzLmVlJiYKdGhpcy5tKCkpfSxZcjpmdW5jdGlvbihiKXt0aGlzLm8oIkpXOiAiK2IudHlwZSl9LG06ZnVuY3Rpb24oYil7Yj90aGlzLnVlP3RoaXMudWUrKzp0aGlzLnVlPTE6dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS50ZihhLnZpZGVvVGFnKT9hLmZjP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuWWN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnRlPnRoaXMudWUmJihiPSExKSx0aGlzLkgoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS56ZygpLGEuQmcoKSxhLmZjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMueGt8fHVhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CmlmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLm9xKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk8oaCl8fHRoaXMuanIoaCl8fCh0aGlzLlIoaCksaD1uZXcgdWEoaCx0aGlzLkopLGguTigpLGguZygpKX19dGhpcy5UKCl9fSxxeDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxvcTpmdW5jdGlvbigpe3ZhciBiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuemt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Taj10aGlzLmFbMl07dGhpcy5RaT10aGlzLmFbNF07dGhpcy5Ebj10aGlzLmFbMl07dGhpcy5Mdz10aGlzLmFbOF07dGhpcy5lcT0KdGhpcy5hWzEwXTt0aGlzLlFrPXRoaXMuYVs4XTt0aGlzLlRwPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMueW89YjtiLnByb3RvdHlwZT17Umo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNqOnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RaTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkx3OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWs6dGhpcy5TcChhKX0sU3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgeGE9Yy55b3x8eGEsemM9bmV3IHhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLlJqKDQpOyhmdW5jdGlvbihjKXtjLkVtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sVTpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxGZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxCYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5FbXx8eWE7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2k9ITA7dGhpcy53Yz10aGlzLlpnPSExO3RoaXMucHMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnNoKCksdGhpcy56bygpLHRoaXMuc2IoKSl9LHBzOmZ1bmN0aW9uKGIpe3JldHVybiBlLnZhKCJ0LW9ubGluZS5kZSIpPwohMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSywiOyIsdHlwZW9mIGIuSywiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5LP2IuSy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLkhhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuSGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkhhP2IuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSGE/dHlwZW9mIGIuaW1hLkhhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLksmJmIuSy5IYT9iLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSyYmYi5LLkhhP3R5cGVvZiBiLksuSGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLks/Yi5LLmFlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5iZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLks/Yi5LLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLks/Yi5LLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5LP3R5cGVvZiBiLksucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5LP2IuSy5rZToidW5kZWZpbmVkWCIsIjsiLGIuSz90eXBlb2YgYi5LLmtlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSxCYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LCRiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMuQmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLkhjKXt2YXIgYj0KdGhpcy5CYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkhjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5IYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkhjfSxocjpmdW5jdGlvbigpe2lmKCF0aGlzLllnKXt2YXIgYj10aGlzLkJiKCksYT10aGlzLmZyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5ZZz0hMCl9cmV0dXJuIHRoaXMuWWd9LGZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5jZCYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuY2Q9ITApO3JldHVybiB0aGlzLmNkfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuUXQoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxRdDpmdW5jdGlvbigpe3RoaXMud2M9ITA7dmFyIGI9dGhpcy5NZygpO2lmKGJ8fHRoaXMuemEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtpZihlLnZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDtlLnZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLApmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueGM9ITA7ZS52YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnhjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5yZyYmYi5hZHMmJih0aGlzLnJnPWIuYWRzKTtyZXR1cm4gdGhpcy5yZ30sCnpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5XZSgpfS5iaW5kKHRoaXMpKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuTWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCkpfSxzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5ocigpKXt2YXIgYT10aGlzLkJiKCksaD10aGlzLiRiKCk7YSYmaCYmKHRoaXMuQmIoKSx0aGlzLiRiKCksdGhpcy53Y3x8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53Yz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQmIoKX1lbHNlIHRoaXMuWmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCksYj10aGlzLiRiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuWmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zaCgpfS5iaW5kKHRoaXMpLDUwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8CiFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTticmVha319LEFvOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkNjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5iYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnphKCl8fChifHwodGhpcy5naT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkgodGhpcy5naSxmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sSW86ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Ydj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlh2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW8oKX0uYmluZCh0aGlzKSw1MCkpKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLll2KXt0aGlzLll2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMuRG18fHphOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS56ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm1hfHx0aGlzLk8oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHphKGEsdGhpcy5KKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLlBiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTmMpfX0pfSkoYyk7dmFyIEFhPWMuRm18fEFhLEJhPW5ldyBBYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CdT10aGlzLmFbNF07dGhpcy5wdj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxXX1jLkd0PWI7Yi5wcm90b3R5cGU9e0F1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm52KGEpfSxudjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHY6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5HdHx8Q2EsQWM9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuQXUoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5aZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmI/dGhpcy5aKGIpOnRoaXMuY2EoKX0scnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GYixoPXRoaXMua2EoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuZWMmJigwPD1oLmluZGV4T2YoZCl8fGEuemQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlplPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQmE6ZnVuY3Rpb24oKXt0aGlzLlplKys7aWYoMTA8dGhpcy5aZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSwKcGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxOZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBEYT1jLkRsfHxEYTsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZlKWlmKHRoaXMuSGJ8fCh0aGlzLkhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSGIrKywxNTx0aGlzLkhiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKX0uYmluZCh0aGlzKSwxMCl9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkRhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5XcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLldwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5IKGIpfX0pfSkoYyk7dmFyIEVhPWMuQ2x8fEVhOyhmdW5jdGlvbihjKXtjLkVsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gubWF8fHRoaXMuTyhoKXx8KHRoaXMuUihoKSwobmV3IEVhKGgsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBGYT1jLkVsfHxGYSxHYT1uZXcgRmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzldO3RoaXMuT3I9dGhpcy5hWzldO3RoaXMua2w9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1RqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWo6dGhpcy54dShhKX0seHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnl1OnRoaXMuTnIoYSl9LE5yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Pcjp0aGlzLmpsKGEpfSwKamw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBIYT1jLnZqfHxIYSxCYz1uZXcgSGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Uaig0KTsoZnVuY3Rpb24oYyl7Yy5waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLnR0PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD0KYi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMudHQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7dGhpcy5vZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMub2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9kKX0sCnVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5maCh0aGlzLm9kKTtlLkdlKHRoaXMub2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLDUwKX0sVTpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxLZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMucGt8fElhOyhmdW5jdGlvbihjKXtjLm9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5IKCEwKX19KX0pKGMpO3ZhciBKYT1jLm9rfHxKYTsoZnVuY3Rpb24oYyl7Yy5xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5KZyhiLCJlbGVtZW50SUQiKTtpZihlLmZoKGEpJiYoYj1uZXcgSWEoYiksIXRoaXMuTyhiKSkpe3RoaXMuUihiKTsKKG5ldyBKYShiLHRoaXMuSikpLmcoKTtyZXR1cm59dGhpcy5QYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5QYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgS2E9Yy5xa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFqPXRoaXMuYVs3XTt0aGlzLnd2PXRoaXMuYVs3XTt0aGlzLm1qPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVs3XTt0aGlzLlBvPXRoaXMuYVszXTt0aGlzLlVxPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzVdfWMubG89YjtiLnByb3RvdHlwZT17emo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFqOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53djp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLm1qOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Obzp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBvOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT1jLmxvfHxNYSxDYz1uZXcgTWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy56aig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sa3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLApiKXt0aGlzLmRhdGFbYV09Yn0sbG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIEE9Yy5oa3x8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy5FZz10aGlzLnBpPSExO3RoaXMudGg9ZDt0aGlzLlNoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLiRhPW5ldyBBKGEpKTt2YXIgYz10aGlzLmhiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkplKHRoaXMuJGEudXJsKSYmbC5RZCl7dmFyIGU9bmV3IEEoYS51cmwpOwplLmt1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwuaGEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5paz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5FZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5oYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7CnRyeXt0aGlzLlNoP3RoaXMuaGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLnBpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuaGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuaGIuc2VuZChhKX1jYXRjaChmKXtsJiZsLkplKHRoaXMuJGEudXJsKT9sLlFkP2wuaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSmUodGhpcy4kYS51cmwpLHRoaXMudGgmJnRoaXMudGgoKX1yZXR1cm4gdGhpcy5oYn19fSkoYyk7dmFyIE5hPWMuaWt8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5HYT0KdGhpcy5ZZD0hMX1jLnNqPWI7Yi5wcm90b3R5cGU9e291OmZ1bmN0aW9uKGEpe3RoaXMuWWQ9YX0sbnU6ZnVuY3Rpb24oYSl7dGhpcy5HYT1hfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e1B3OiJBZENsaWNrVGhydSIsUnc6IkFkRXJyb3IiLFN3OiJBZFN0b3BwZWQiLFZ3OiJBZExpbmVhckNoYW5nZSIsV3c6IkFkVGFnUGFyc2VkIixadzoiQWRWaWRlb0NvbXBsZXRlIixieDoiQWRMb2FkZWQiLGN4OiJBZFNraXBwZWQiLGR4OiJBZFN0YXJ0ZWQiLFR3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsVXc6IkFkSW1wcmVzc2lvbiIsUXc6IkFkQ3JlYXRpdmVWaWV3IixYdzoiQWRWaWRlb01pZHBvaW50IixZdzoiQWRQYXVzZWQiLAokdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLllkLGJbZF0pfSxVdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuR2EmJnRoaXMuR2EuWGQpZm9yKHZhciBiIGluIHRoaXMuR2EuWGQpdGhpcy5HYS5YZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkdhLHRoaXMuR2EuWGRbYl0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EuZ2V0RXJyb3IoKTsKYSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLllkJiZ0aGlzLlZ0KCk7dGhpcy5HYSYmdGhpcy5VdCgpfX19KShjKTt2YXIgT2E9Yy5zanx8T2E7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMuemM9IiI7dGhpcy5sZT10aGlzLnljPXRoaXMueWI9bnVsbDt0aGlzLm9wPXRoaXMuTmI9dGhpcy5saD0hMTt0aGlzLkthPSIiO3RoaXMuaGg9ITE7dGhpcy55YT10aGlzLnNkPSIiO3RoaXMuZGg9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuZWY9ITE7dGhpcy5vYT1bXTt0aGlzLlNnPXRoaXMuamM9IiI7dGhpcy5KZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5TYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0KInN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMua2M9IiI7dGhpcy5sYz1bXTt0aGlzLm1jPVtdO3RoaXMuTWQ9W107dGhpcy5SYz0iIjt0aGlzLkFiPSExO3RoaXMud2Y9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5HYz0hMTt0aGlzLkpvPXRoaXMuU2Q9bnVsbDt0aGlzLk5oPXRoaXMub2M9dGhpcy53Zz10aGlzLnpmPXRoaXMuUWQ9dGhpcy5uZT10aGlzLlhjPSExO3RoaXMuamI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLlVnPSExO3RoaXMuVGc9MUUzO3RoaXMuZWQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5SZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMuemMsYWR0YWdtb2RpZmllcjp0aGlzLnliLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy55YyxhZHRhZ3JlZ2V4OnRoaXMubGUsYml0cmF0ZTp0aGlzLlFhLApqc3BvcHVwczp0aGlzLmxoLHNpZGVsb2Fkczp0aGlzLk5iLGRpc2FibGV0ZXN0czp0aGlzLm9wLGhvbWFkQWxpYXM6dGhpcy5LYSxpc0luaXRpYWxpemVkOnRoaXMuaGgsZ2xvYmFsQ29uZmlnOnRoaXMuc2QsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLmRoLHNlcnZlcjp0aGlzLm9hLHN2bUNvbmZpZzp0aGlzLmpjLGhvbWFkQWRwYXRoOnRoaXMuU2csSE9NQURfVkVSSUZJRUQ6dGhpcy5KZixIT01BRF9CTE9DS0VEOnRoaXMuSWYsSE9NQURfTk9CTE9DS0VSOnRoaXMuU2IsSE9NQURfQURCTE9DS0VSOnRoaXMucWMsdGVzdEhpZGU6dGhpcy5rYyx0ZXN0VGFnczp0aGlzLmxjLHRlc3RUYWdzSlM6dGhpcy5tYyx0ZXN0VGFnc1hIUjp0aGlzLk1kLHRlc3QzUENvb2tpZTp0aGlzLlJjLHRocm90dGxlOnRoaXMud2YsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5HYywKY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5uZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5RZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy56Zixjb25maWdGYWlsdXJlczp0aGlzLmpiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5sYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5taSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZWQsYWRGYWxsYmFja1VSTDp0aGlzLlJmfX0sR3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuamIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxrZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxwcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5qYltiXSYmMT09dGhpcy5qYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5MYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmpvKGEpfSxBYTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgQShhKTtmPXRoaXMuSWUoYSk7CmM9dGhpcy53YShhKTtmPyh0aGlzLkljKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLk1jKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuemN8fHRoaXMueWJ8fHRoaXMueWN8fHRoaXMubGUpJiYoZz10aGlzLmVzKGcpKTthPW5ldyBBKGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMucnEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLkljKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxJYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5vYSYmdGhpcy5vYS5sZW5ndGgmJjA8dGhpcy5vYS5sZW5ndGgmJihiPXRoaXMub2FbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5JZShhKTtyZXR1cm4gYn0sCnJxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5LYSYmMDx0aGlzLkthLmxlbmd0aClyZXR1cm4gdGhpcy5LYTtmb3IoZCBpbiB0aGlzLkthKWlmKGI9dGhpcy5LYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLmt4O3JldHVybiJub25lIn0sdWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYVt0aGlzLktoXX0sTWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnVkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHFoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihiPWQuZmFsbGJhY2spO3JldHVybiBifSxkczpmdW5jdGlvbihhLGIpe3ZhciBkPWUud2EoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEk9MDtJPGcubGVuZ3RoO0krKyl7dmFyIGs9Z1tJXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnFoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5xaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGVzOmZ1bmN0aW9uKGEpe3RoaXMuemMmJgooYSs9dGhpcy56Yyk7aWYodGhpcy55Yilmb3IodmFyIGIgaW4gdGhpcy55Yil0aGlzLnliLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLnliW2JdKSk7dGhpcy55YyYmKGE9dGhpcy5kcyhhLHRoaXMueWMpKTtyZXR1cm4gYX0sR286ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuQm8odGhpcy5GYS5jbGllbnRBUElzKX0sQm86ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE9hO2EucHVibGlzaGVyQVBJJiZiLm91KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5udShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5oaD0hMDt0aGlzLnNkPWE7dGhpcy55YT1iO3RoaXMuZWY9ZDt0aGlzLlNkPWY7dGhpcy5EYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5HbygpO3RoaXMuU3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMueWEpdGhpcy5RcigpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuQWMoKX1jYXRjaChnKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnlhKXRyeXt0aGlzLnlhPWIsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sU3I6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMuc2QrdGhpcy5pZSgiZ2xvYmFsIikpLHRoaXMuRXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sUXI6ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBBKHRoaXMueWErdGhpcy5pZSgiY2xpZW50IiwKLTEhPXRoaXMueWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rZigiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0saWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkxiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubmUpe3RoaXMubmU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5iYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuZGg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSWYpKTt0aGlzLlFiKCk7ZS5FYyhrLmt0KTsoYj1lLmJjKHRoaXMudWQoKSkpfHwoYj1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxFcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLnRiKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuamN8fHRoaXMuS2F8fHRoaXMuQWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5RYigpKX19LEFjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihiKXRyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7ZD10aGlzLnlhfWVsc2UgZD10aGlzLnlhO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLnRiKGQuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLm9hPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5vYS5sZW5ndGg7YSsrKXRoaXMub2FbYV09dGhpcy5vYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUudmEoIndlYi5kZSIpfHwKZS52YSgiZ214Lm5ldCIpfHxlLnZhKCJnbXguYXQiKXx8ZS52YSgiZ214LmNoIil8fGUudmEoIjF1bmQxLmRlIikpJiYhdGhpcy5JYygpKWZvcihhPTA7YTx0aGlzLm9hLmxlbmd0aDthKyspdGhpcy5vYVthXT10aGlzLm9hW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuamM9ZC5jb25maWd8fCIiO3RoaXMuS2E9ZC5hbGlhc3x8bnVsbDt0aGlzLlNnPWQuYWRwYXRofHwiIjt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLm9hLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuamMmJnRoaXMuS2EmJnRoaXMub2EubGVuZ3RoP3RoaXMuSmMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpLHRoaXMuUWIoKSl9LEpjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyBBKHRoaXMuTWMoKSksCmQ9dGhpcy53YSh0aGlzLmpjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyBBKHRoaXMuamMrdGhpcy5pZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkpjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuR2MmJgp0aGlzLmlzRW5hYmxlZCl7dGhpcy5HYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUWQ9dGhpcy50YihiLnN0cmljdCk7dGhpcy56Zj10aGlzLnRiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLndnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5sYj10aGlzLnRiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy50YihiLmVuYWJsZWQpO3RoaXMua2M9Yi50ZXN0aGlkZXx8IiI7dGhpcy5tYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk1kPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy5SYz1iLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy56Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnliPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnljPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5sZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5saD1iLmpzcG9wdXBzfHwhMTt0aGlzLk5iPQpiLnNpZGVsb2Fkc3x8ITE7dGhpcy5vYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMub2M7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmZkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5taT1iLnZtYXBzfHwiIjt0aGlzLmVkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fDFFMzt0aGlzLlJmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLndmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuR2MmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkdjPSEwLHRoaXMuSmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZnYoKSYmKHRoaXMua2N8fHRoaXMubWN8fHRoaXMubGN8fHRoaXMuTWQpP3RoaXMuZWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlNiKSksdGhpcy5wZSgpLHRoaXMuUWIoKSk6dGhpcy5XdSgpOih0aGlzLmlzRW5hYmxlZD0KITEsdGhpcy52ZigpKX19LFd1OmZ1bmN0aW9uKCl7dGhpcy5WdSgpO3RoaXMuWHUoKX0sWHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxJPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYywKZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihJLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoSSkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuemIoYShjKSkrCmF0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUubmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmhhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx2ZjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5TYikpO3RoaXMuUWIoKX0sTGQ6ZnVuY3Rpb24oYSl7dGhpcy5YYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGEpKSx0aGlzLlFiKCksdGhpcy5wZSgpKX0sVnU6ZnVuY3Rpb24oKXtpZih0aGlzLmtjKXt2YXIgYT1lLm5kKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5tcigpKXRoaXMuTGQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMua2MpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5rYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5YaCgpfX1lbHNlIHRoaXMuWGgoKX0sV2g6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy4kdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxkKHRoaXMucWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5sYz10aGlzLk1kKSYmdGhpcy5sYy5sZW5ndGgpe3ZhciBkPXRoaXMubGMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSwkdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTGEobmV3IEEoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFhoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMuYXYoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLldoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLm1jJiZ0aGlzLm1jLmxlbmd0aCl7dmFyIGQ9dGhpcy5tYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLldoKCl9LGF2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sVGg6ZnVuY3Rpb24oKXtpZih0aGlzLlJjKXRyeXtlLkxlKHRoaXMuUmMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMudGIoYS5jYyk7dGhpcy52ZigpfS5iaW5kKHRoaXMpLHRoaXMuVWguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5VaCgpfWVsc2UgdGhpcy52ZigpfSwKVWg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuU2IpKTt0aGlzLlFiKCk7dGhpcy5wZSgpfSxtcjpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LFFiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuWGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO3RoaXMuUmMmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5BYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuSmYpKTt0aGlzLlNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuU2QmJnRoaXMuU2Qoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuQWJ9KX0sCkZvOmZ1bmN0aW9uKCl7aWYodGhpcy56ZiYmdGhpcy5HcSgpKXt2YXIgYT10aGlzLnBxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxhaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LExhOmZ1bmN0aW9uKGEsYixkLGMscCxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLlRnJiYhdGhpcy5VZyYmKHRoaXMuVWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlRnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2MmJihhLnBpPSEwKTtwJiZlLmtyKCkmJihhLkVnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxDbzpmdW5jdGlvbigpe2UuVmEoKXx8CmUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuSWMoKXx8KGE9dGhpcy53YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxVdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5taX0sRG86ZnVuY3Rpb24oKXt0aGlzLkFhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy5BYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuS3YuYmluZCh0aGlzKSx0aGlzLkp2LmJpbmQodGhpcykpfSxLdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuUnAoKX0sSnY6ZnVuY3Rpb24oKXt9LFJwOmZ1bmN0aW9uKCl7ZS5FYyhrLlFwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKcGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5OYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBLO3dpbmRvd1tkLmphKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxmdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLndmfSxMYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0KIiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGMsZSxnLGssbCxtPTA7bTxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobSsrKSxjPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksZz1kPj4yLGQ9KGQmMyk8PDR8Yz4+NCxrPShjJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihjKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9YT4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocikrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIFBhPWMuamt8fFBhLGw9bmV3IFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ycj10aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbMl07dGhpcy5Ecz10aGlzLmFbOF07dGhpcy5Kaz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLllxPWI7Yi5wcm90b3R5cGU9e1dyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ycjp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHA6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRzOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFhPWMuWXF8fFFhLERjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLldyKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuVT90aGlzLmViPWEuZi5VKCk6dGhpcy5lYj0iIjthLmYuYWgmJmEuZi5haCh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlNlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQnYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5rYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlliPXRoaXMuZGQ9ITE7dGhpcy5ibz0xRTM7dGhpcy50YT1udWxsO3RoaXMuST1iO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLklkPXt9O2UucWIoIm5ld0JpZ0FkSWQiKTt0aGlzLmtvPWUuYWEoMTApO3RoaXMucmY9MDt0aGlzLmJkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuYmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLmJkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnNuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuWGU9dGhpcy5IZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5oZT0hMTt0aGlzLmRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuZWM9ITE7dGhpcy5Xbz1lLmFhKDEwKTt0aGlzLktiPWUuYWEoMTApO3RoaXMuSWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5UZD10aGlzLlJiPXRoaXMucmU9dGhpcy5rZD10aGlzLkpkPXRoaXMudWI9dGhpcy5wYz10aGlzLnZoPXRoaXMucGQ9dGhpcy5pdj10aGlzLndiPXRoaXMuSmI9ITE7dGhpcy51Yz1bXTt0aGlzLmdjPXt9O3RoaXMuZXQ9MjAwO3RoaXMuR2Y9CnRoaXMuU2M9dGhpcy5tZT10aGlzLkZmPXRoaXMuZGY9ITE7dGhpcy5VZT17fX1jLmRrPWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxJYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGJpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkdiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLmhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LE5lOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMud2I9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5JLlYpdGhpcy5yZisrLGUucWIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuSS5GbygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkkuVWEmJgp0aGlzLkkuaXNFbmFibGVkPyh0aGlzLmJpKCksbmV3IFQodGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5JLm9jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYmkoKSxuZXcgVCh0aGlzLGEsdGhpcy5uaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuSS5vYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLk5lKGEsYixkKX0sNTApfX0sJGU6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlRkPXRoaXMuUmI9dGhpcy5wZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy5QZyhhKTt0aGlzLnVjPXRoaXMuR2coYSk7dGhpcy5RbygpfSxQZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5JZD10aGlzLkFxKGEpKSx0aGlzLlBnKGEucGFyZW50KSl9LEdnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5HZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLmtxKGEpKSk7cmV0dXJuIGN9LGtxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmCmEuTSYmYS5NLmdldEF0dHJpYnV0ZSl7Yj1hLk0uZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLk0pe2I9YS5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuTS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5NLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLm5iKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5tZCYmYS5tZC5lcnJvciYmYS5tZC5lcnJvci5jb2RlJiYoYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuVWMuY29kZTpiPT1HLlpkLmNvZGU/ZS52KGsubHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5PZSgpLGI9PUcuTWYuY29kZSYmCmUudihrLnFzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlBwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5NdSgpO3RoaXMuWGEoImVtcHR5Iik7dGhpcy5JLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuQWIsITApO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTmYuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUudihrLkF3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuV2QuY29kZTplLnYoay5ycywKdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuSXYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWmIoYSk7dGhpcy5SYSgpfSxaYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLk1lKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLnJlPSExO3RoaXMuZ2I9CnRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5nYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuZGY9ITB9Y2F0Y2goZil7fX1jYXRjaChnKXt9Yi5LeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgpiLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLnNuJiZ0aGlzLnBsYXllci53ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIud2UoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuUC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5QW2NdLnR5cGUpJiZ0aGlzLm1uKGIsYS5QW2NdLnVybCsiIixhLlBbY10udHlwZSk7dGhpcy5kZiYmYi5sb2FkKCk7aWYodGhpcy5ZaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5xbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmRmP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2gobCl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5TbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuZ2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuc3UoKSk6dGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sc3U6ZnVuY3Rpb24oKXt0aGlzLkZmPSEwO3RoaXMudWI9dGhpcy5wYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy51Yj0hMCk7ZS5xZSgpO3RoaXMuYyYmCnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4ueGEmJmUucm4odGhpcy5jLm9yaWdpbi54YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5wZigpO2ZvcihhPXRoaXMuYi5MO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIucGYoKTt0aGlzLmdiPXRoaXMuYi5MO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUub2YodGhpcy5nYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYi5MO3RoaXMuaWkoInZwYWlkIik7aWYodGhpcy51Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLk9iKCJtdXRlZCIsCiJjb250ZW50Iik7ZS52KGsueGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5HLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuTC5hcHBlbmRDaGlsZCh0aGlzLkcpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5vZih0aGlzLkcsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkcub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLkRxKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5HLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkcsImNvbmZpZyIsCmcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmZnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5JKTt0aGlzLkcuc3JjPWE7ZS5qZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5kYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy51Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuJHYoKSx0aGlzLmIuZGMoITApLCF0aGlzLlJiKSl7dmFyIGI9CjJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5SYj17ZWw6dGhpcy5HLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5IZSh0aGlzLlJiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuZGMoITApLHRoaXMuZHcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmRjKCEwKSx0aGlzLmh3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PQphLmRhdGEubmFtZSYmdGhpcy5mdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLml3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlhiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLm9nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjsKYi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmZlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuYXcoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlNjJiYodGhpcy5HZj0hMSx0aGlzLmljKCkpLHRoaXMuYncoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy51Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuZmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmplKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuamUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuY2coZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxhdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMudHJhY2soInBhdXNlIik7CmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnBjPSEwfSxidzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5wYz0hMX0sZHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay4kZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxjdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7CmUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLiRjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMucGQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGd3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5hZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwKZXc6ZnVuY3Rpb24oKXt0aGlzLkJmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5HLnBhcmVudE5vZGU7dGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5xZSgpO3RoaXMuRz0hMTt0aGlzLlJhKGEpfX0sWnY6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmt3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uaSghMCl9LG1uOmZ1bmN0aW9uKGEsCmIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuSWMoKSl7dmFyIGQ9Yi53YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuSSk7Zi5vbmVycm9yPXRoaXMuU3YuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuSSkpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0scW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLmtpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuQmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5DZi5iaW5kKHRoaXMpKX0sRGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMua2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5CZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkNmLmJpbmQodGhpcykpfSxqaTpmdW5jdGlvbihhKXt0aGlzLllifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWJ8fHRoaXMuRGYoYSl9LmJpbmQodGhpcyksCnRoaXMuYm8pKX0sRGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZGQmJnRoaXMuWWgodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5ZYil7dGhpcy5kZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuSS53Z3x8dGhpcy5JLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuUHYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuT3YoKTt0aGlzLmlpKCk7dGhpcy5nZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmtkfHwKdGhpcy5UZigpfSxUZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmtkfHwoYT90aGlzLlJhKCk6KHRoaXMuU2UoITApLHRoaXMuVGYoITApKSl9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmhjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjLmJpbmQodGhpcykpKTpMPWZ1bmN0aW9uKCl7dGhpcy5oZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuc2YoKSl9LmJpbmQodGhpcyk7dGhpcy55ZSgpLkxoKHRoaXMpfSxCZjpmdW5jdGlvbigpe3RoaXMuSS5sYiYmIXRoaXMuSmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKZS52KGsuZm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LGpuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuS2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5KdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuVWQmJnRoaXMuam4odGhpcy5jLlVkKTtpZighdGhpcy5yZSlpZih0aGlzLnJlPSEwLHRoaXMuVGR8fChlLnYoay50cyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy52Ynx8dGhpcy5jLnNjKXtlLnFiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLnJmKys7dGhpcy5ZYj10aGlzLmRkPSExO3RyeXt0aGlzLkRkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSGQ9ITE7dHJ5e3RoaXMuYi5maSgpfWNhdGNoKGcpe310aGlzLkpkPSEwO3RoaXMuYi5DZSgpO3RoaXMuZWM9ITE7dGhpcy55ZSgpLkdoKCk7dGhpcy5jLnZiJiZ0aGlzLmMub3JpZ2luLlRlKCk7dGhpcy5jLnNjJiYoYT90aGlzLmMub3JpZ2luLnJoKCk6dGhpcy5zZSgpKX1lbHNlIHRoaXMuc2UoKX0sU3Y6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5EZCh0aGlzLnZpZGVvKSx0aGlzLkNmKGEpKX0sQ2Y6ZnVuY3Rpb24oYSl7dGhpcy5ZYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkkuQ28oKTsKdGhpcy5jLm9yaWdpbi54Zyh3LldkKX0sa2k6ZnVuY3Rpb24oKXtpZih0aGlzLml2KXRoaXMuUmEoKTtlbHNle3RoaXMuZWM9ITA7dGhpcy5iLmYuQmEmJiF0aGlzLkpkJiZ0aGlzLmIuZi5CYSgpJiZlLnYoay5CYyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5xdihhKTtpZighdGhpcy5SYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlJiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5UZD0hMDtlLnYoay5saSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuSGUodGhpcy5SYil9Yz0iIjt0aGlzLmMucWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2gpKSYmKGM9dGhpcy5jLnFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkhkfHwodGhpcy5IZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy52Yj8odGhpcy5ZYj10aGlzLmRkPSExLHRoaXMuRGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSGQ9ITEsdGhpcy5iLmZpKCksdGhpcy5jLm9yaWdpbi5UZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmJkLnJlcGxhY2UoIlt0aW1lXSIsZS5GZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmhlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxjaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMucGR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxxdjpmdW5jdGlvbihhKXtlLnYoay5mZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuZGl8fHRoaXMuSmJ8fCgwPT1hJiYodGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkkuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmNpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fHRoaXMuUWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuSS5sYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLiRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLnBkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkkubGImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5JLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuYWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5kaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGIsITApfSxMdTpmdW5jdGlvbigpe2UuT2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sUWg6ZnVuY3Rpb24oKXtlLk9kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LE11OmZ1bmN0aW9uKCl7ZS5PZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuT2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuRmZ8fHRoaXMuSS5sYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxPYjpmdW5jdGlvbihhLGIpe3RoaXMuSS5sYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkpiKXt0aGlzLlVlJiYKdGhpcy5VZS50cmFjayYmdGhpcy5VZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5CcSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLm1lPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSWQuaW1wcmVzc2lvbnMmJmUuaXIoZy51cmwsdGhpcy5JZC5pbXByZXNzaW9ucyk/dGhpcy5NZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZ24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5NZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMuZnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkZmJiYoYj0iX3ZwYWlkIik7dGhpcy5TYyYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxNZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuSS5BYShhKSxjJiZiLmxuKGMpLGZ8fChmPXRoaXMudmcpLGV8fChlPXRoaXMudmcpLHRoaXMubm4oYSksdGhpcy5JLkxhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LG5uOmZ1bmN0aW9uKGEpe3RoaXMuZ2NbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmdjW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuZ2M9Cnt9fSxPdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmdjKXRoaXMuZ2MuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5nY1tiXSYmYSsrO3JldHVybiBhfSxCcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFB2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Rdi5iaW5kKHRoaXMpKX0sUXY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmljKCk6dGhpcy5jLlhiJiYoZS52KGsub2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuSS5lZHx8dGhpcy5TYylhPSJfYmxhbmsiO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5YYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuWGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxPdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5iZC5yZXBsYWNlKCJbdGltZV0iLGUuRmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuSS5mZCYmKGI9dGhpcy5JLmZkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuSS5mZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkZkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkkuZmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxpaTpmdW5jdGlvbihhKXtpZighZS50Zih0aGlzLmNvbnRyb2xzKSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuV287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuJGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4kaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuaWMoKTt0aGlzLkZkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMua3YuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5qdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLnFmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmljKCk7dGhpcy5GZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5DYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5jZyhmdW5jdGlvbihhKXt0aGlzLkNhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLnBnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5TZSgpKTt0aGlzLkViKCl9fSxFYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGljOmZ1bmN0aW9uKCl7dGhpcy5DYSYmImJsb2NrIj09dGhpcy5DYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkdmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuJGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMucGM/KGUubGEodGhpcy5HLCJjb250cm9sIiwicGxheSIpLHRoaXMuQ2EmJih0aGlzLkNhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnBjPSExKTooZS5sYSh0aGlzLkcsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkNhJiYodGhpcy5DYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5FYigpLHRoaXMuRGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnBjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay4kYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LGp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxrdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMudWI/KGUubGEodGhpcy5HLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5HLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnhkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxCdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5PYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsueWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGhjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuaGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmhjKTt0aGlzLmtkfHx0aGlzLmhlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLnJyKCkmJnRoaXMucXIoKSYmKHRoaXMuSS5YY3x8InNwaWVnZWwuZGUiPT1lLmJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkdiJiZ0aGlzLnJ2KCl8fCh0aGlzLmtkPSEwLHRoaXMud2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2IpLHRoaXMud2I9ITEpLHRoaXMucWcoKSl9LHJyOmZ1bmN0aW9uKCl7dmFyIGE9ZS5uZCgpO3JldHVybiB0aGlzLkkub2MmJiFlLlZhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHFyOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGV8fChhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubWUmJmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhlfSxxcTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1iLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuWGU9dGhpcy5TYz10aGlzLkdmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5aYSgpLCEwKTt0aGlzLm1lPSEwO3ZhciBhPXRoaXMucXEoKSxhPWUuZmcoYSx0aGlzLkksITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLk5lKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LHFnOmZ1bmN0aW9uKGEpe3RoaXMuT3UoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLmV0KToodGhpcy5KZD0hMCx0aGlzLmIuQ2UoKSx0aGlzLmIuWnQoKSx0aGlzLmVjPSExLGUudihrLlZvLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy55ZSgpLkdoKCkpfSx5ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEoIm1pblZpcyIpO2EmJihlLkdlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMuemQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuWGIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy51YyYmMDx0aGlzLnVjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy51YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5rbysiLSIrdGhpcy5yZjt0aGlzLmMmJnRoaXMuYy5MZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuTGcoKSk7cmV0dXJuIGF9LHZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ka3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzFdfWMuVHU9YjtiLnByb3RvdHlwZT17Wmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5UdXx8U2EsRWM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuWmkoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5wYT1udWxsO3RoaXMuWT1bXTt0aGlzLk09bnVsbDt0aGlzLnRjPXRoaXMudmM9ITE7dGhpcy54YT0iIjt0aGlzLkVmPSExO3RoaXMuV2c9IiI7ZCYmZC5lbXB0eT90aGlzLlZyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLkNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLm5kKCksYjtiPWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOmwuQWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnNnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLktkKGEpKSsiJnR5cGU9anMiLGI9bC5BYShsLktkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLkFhKGwuS2QoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVXIuYmluZCh0aGlzKSx0aGlzLlJyLmJpbmQodGhpcykpfSxIZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5wYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuR2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5wYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMucGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkdifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5HYnx8dGhpcy5vcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LFVyOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMucGE9YS5yZXNwb25zZVhNTCx0aGlzLnBhfHwodGhpcy5wYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuJGQpKX10aGlzLlk9CnRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLldnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5MYygpOnRoaXMuc2EodGhpcy5TYSh3LlVjLHtlcnJvcjp0aGlzLkVmP0cuWmQ6Ry5MZn0pKX0sVnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMucGF8fCh0aGlzLnBhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LiRkKSl9dGhpcy5ZPXRoaXMuSGcoKTt0aGlzLnZjPXRoaXMudWYoKTt0aGlzLnRjPXRoaXMuVmgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnNhKHRoaXMuU2Eody5VYyx7ZXJyb3I6dGhpcy5FZj9HLlpkOkcuTGZ9KSl9LFJyOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuS2Yse2RlcHRoOmF9KSl9LExjOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuWS5zaGlmdCgpO3RoaXMuc3IoKT90aGlzLmJ2KCk/KGErKyxuZXcgYih0aGlzLAp0aGlzLlFnKCksaCx7QWRTeXN0ZW06dGhpcy5qcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5OZikpOihhPTAsdGhpcy5GdigpJiZ0aGlzLiRlKHRoaXMuJG8oKSkpfSxUZTpmdW5jdGlvbigpe3RoaXMudmM/KHRoaXMudmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQuVGUoKX0scmg6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkxjKCkpOnRoaXMucGFyZW50LnJoKCl9LEZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWnUoKT90aGlzLll1KCk/ITA6KC0xIT10aGlzLkZjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVmQpKTp0aGlzLnNhKHRoaXMuU2Eody5IZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuVWMsRy5NZikpLCExKX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy54YXx8KHRoaXMueGE9IiIpO2EuVWR8fChhLlVkPVtdKTthLlVkLnB1c2godGhpcy5XZyk7CmEuUGE9YS5QYS5jb25jYXQodGhpcy5QZSgpKTthLnZiPWEudmI/YS52Yjp0aGlzLnZjO2Euc2M9YS5zYz9hLnNjOnRoaXMudGM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3RoaXMucGFyZW50LiRlKGEpfSwkbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnhhfHwodGhpcy54YT0iIik7YS5kdXJhdGlvbj10aGlzLkZjKCk7YS5QPXRoaXMuTmcoKTthLlhiPXRoaXMubHEoKTthLlJ4PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuaXEoKTthLnFmPXRoaXMuenEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnhhfHwodGhpcy54YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMueGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkRnOwppZighdGhpcy5NJiZ0aGlzLnBhJiZ0aGlzLnBhLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5NPXRoaXMucGE7dHJ5e2lmKHRoaXMuTSYmdGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgYz0hMTsoYz10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5NJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVmQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLm1xKCkpOmIuUGEuY29uY2F0KHRoaXMudnEoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5aYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlpiJiZ0aGlzLnBhcmVudC5aYihiKSxhPTAsdGhpcy5MYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLAphPTApfSxaYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5aYihhKX0seGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxadTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LFl1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx1ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy51ZigpJiYoYT0hMCk7cmV0dXJuIGF9LEp0OmZ1bmN0aW9uKGEpe3RoaXMueGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy54YT0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy54YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuRWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sc3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlFnKCkubGVuZ3RofSxRZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhlKHRoaXMuTSwiVkFTVEFkVGFnVVJJIil9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGUodGhpcy5NLCJBZFN5c3RlbSIpfSxQZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJgohdGhpcy5laChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuZWgoYS5wYXJlbnROb2RlKTohMX0sdnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sbXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LE5nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC0KYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0saXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5yZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLk0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSsKNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx6cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0seGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxBZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZChhKToiIn0scmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhKTtiJiYoYj1iLnRyaW0oKSk7CiFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLkNtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVsxMF07dGhpcy5GdD10aGlzLmFbNl07dGhpcy52bD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJtPWI7Yi5wcm90b3R5cGU9e29vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbzp0aGlzLkV0KGEpfSxFdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRnQ6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5CbXx8VmEsRmM9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLm9vKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5QPVtdO3RoaXMuWGI9IiI7dGhpcy5CPXRoaXMuc2M9dGhpcy52Yj0hMTt0aGlzLkRlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5FZT0iIn1jLktsPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuUC5sZW5ndGg7YisrKWlmKDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5wYSl7dmFyIGE9dGhpcy5vcmlnaW4ucGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5EZT1hW2NdKX1yZXR1cm4gdGhpcy5EZX0sTGc6ZnVuY3Rpb24oKXtpZih0aGlzLkVlKXJldHVybiB0aGlzLkVlO3ZhciBhPQoiIjsoYT10aGlzLnRxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5FZT1hfSxEcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlAubGVuZ3RoO2IrKylpZigwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuUFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLlBbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5QW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuUFtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuS2x8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9sPXRoaXMuYVs2XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfWMudXY9YjtiLnByb3RvdHlwZT17bmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9sOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMudXZ8fFdhLEdjPW5ldyBXYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5ubCg0KTt2YXIgdz17JGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxVYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxOZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLE9hOiJMT0FEX0VSUk9SIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCk13Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxWZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17TGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sTWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTnc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxaZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubXY9dGhpcy5hWzldO3RoaXMucWo9dGhpcy5hWzNdO3RoaXMuaHY9dGhpcy5hWzFdO3RoaXMuQ2o9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5EcD1iO2IucHJvdG90eXBlPXtsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5waihhKX0scGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFqOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5odjp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkRwfHxYYSxIYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5sdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9CmE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkhqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ianx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT3A9dGhpcy5hWzVdO3RoaXMuYnQ9dGhpcy5hWzRdO3RoaXMuSXU9dGhpcy5hWzhdO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuaXQ9dGhpcy5hWzEwXTt0aGlzLnVrPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzNdfWMuenU9YjtiLnByb3RvdHlwZT17TnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk9wOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5idDp0aGlzLkh1KGEpfSxIdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSXU6dGhpcy5jbihhKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRuOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuaXQ6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51azp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuenV8fFlhLEljPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5wKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLlJkPVtdO3RoaXMuRWg9W107dGhpcy5WZT1bXTt0aGlzLlJ2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5OKCl9CmMuT3c9YjtiLnByb3RvdHlwZT17TjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIGs9Zy5jb250ZW50V2luZG93O2suR3g9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuV3QuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuT3QuYmluZCh0aGlzKX07dmFyIGw9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtsLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5SZC5wdXNoKHtzcmM6YyxmcmFtZTpnLGp0OmUsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlZlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuVmVbYl07Yy50eXBlPT09YSYmYy50byh0aGlzLm5xKGEpKX19LG5xOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e1B4OiEwLE94OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e0N4OiJ2aWRlbyIsU3g6ImpzQ3VzdG9tIixUeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxVeDoxLG14OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sQ3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlJkLmxlbmd0aDtiKyspaWYodGhpcy5SZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLlJkW2JdLmp0O3JldHVybiIifSxXdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuQ3EoYiksdmVuZG9yOmJ9KTsKdGhpcy5LdSgpfSxPdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUnYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5kZyhhLGIpfSxkZzpmdW5jdGlvbihhLGIpe3RoaXMuVmUucHVzaCh7dHlwZTphLHRvOmIsTXg6ITF9KX0sS3U6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLmxyfHwoYS5GeCh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuUXgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLmxyPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklsPXRoaXMuYVsyXTt0aGlzLlJzPXRoaXMuYVs2XTt0aGlzLkR1PXRoaXMuYVs0XTt0aGlzLkxvPQp0aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbOV07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5tdD10aGlzLmFbNV07dGhpcy5raj10aGlzLmFbOV07dGhpcy51bj10aGlzLmFbMTBdO3RoaXMuTnM9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy5Qcj1iO2IucHJvdG90eXBlPXtIbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWw6dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJzOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EdTp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zczp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5rajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudW46dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk5zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5Qcnx8WmEsSmM9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuSGwoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5rYj1hLklnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmVnPSExO3RoaXMuVmI9W119Yy53aj1iO2IucHJvdG90eXBlPXtmcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLmZxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5McShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmVnPSEwfSxmaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuQmMsdGhpcy5mLnMoKSl9LFp0OmZ1bmN0aW9uKCl7dGhpcy5lZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuamQsdGhpcy5mLnMoKSkpfSxwZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5MLnN0eWxlLnpJbmRleD1hO3RoaXMuTC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkwuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5rYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTt0aGlzLmYuT2MmJnRoaXMuZi5PYygpP3RoaXMuZi5JZygpLmFwcGVuZENoaWxkKHRoaXMuTCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkwpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LExxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxacDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxkYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlpwKHRoaXMua2IpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQ2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk9jKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5MLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVmIubGVuZ3RoO2ErKyl0aGlzLlZiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUudGYodGhpcy5MKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5kYy5iaW5kKHRoaXMpLDEwKX0sY2c6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMuVmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlZiLnB1c2goYSl9LENlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMud2p8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE89CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ty5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ty5pZD1lLmFhKDEwKTtPLmNvbnRyb2xzPSEwO0MucHVzaChPKX12YXIgTD0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlpPXRoaXMuYVszXTt0aGlzLmhxPXRoaXMuYVsyXTt0aGlzLlpuPXRoaXMuYVsyXTt0aGlzLnRsPXRoaXMuYVs0XTt0aGlzLkZzPXRoaXMuYVszXTt0aGlzLndwPXRoaXMuYVsxXTt0aGlzLkNwPXRoaXMuYVsyXTt0aGlzLmVvPXRoaXMuYVs4XTt0aGlzLkhzPXRoaXMuYVsxMF07dGhpcy5kbD0KdGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5ucD1iO2IucHJvdG90eXBlPXt4aTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueWk6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhxOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abjp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudGw6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkZzOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53cDp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ3A6dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVvOnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZGw6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5ucHx8YmIsS2M9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MueGkoNCk7KGZ1bmN0aW9uKGMpe2MueGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVyhhKTt0aGlzLkVkKGIpO3RoaXMudGcoKX0sRWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sVTpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sczpmdW5jdGlvbigpe3ZhciBiPQp7fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkphKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy54bHx8Y2I7KGZ1bmN0aW9uKGMpe2Mud2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5VYj10aGlzLlVifHwhMTt0aGlzLldmPXRoaXMuWWY9dGhpcy4kZz10aGlzLmVhPXRoaXMueGY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5YcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMueGY9ITA7dGhpcy4kZyYmCnRoaXMubmcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmVjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZ2QoKTt0aGlzLiRnPSEwO3RoaXMubmcoKX0uYmluZCh0aGlzKSk7dGhpcy5pZygpfSxuZzpmdW5jdGlvbigpe2lmKCF0aGlzLlViKXt0aGlzLmdkKCk7aWYoIXRoaXMueGYmJiF0aGlzLmdkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy54ZiYmdGhpcy5XZiYmIXRoaXMuWWYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLAoxMDApfX0sZ2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE9nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGlnOmZ1bmN0aW9uKCl7aWYodGhpcy5nZCgpKXt2YXIgYj10aGlzLk9nKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuWWY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5XZj1iLmp4fXRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbng6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LEZjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5GYygpOi0xfSx3cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxYcDpmdW5jdGlvbihiLGEpe3RoaXMuVWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5VYnx8MzAyPT10aGlzLlViP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTpiLkZlKCk/KHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLndxKGIpPyh0aGlzLkgoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMud2x8fGRiOyhmdW5jdGlvbihjKXtjLnlsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sbnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWwuJG0uWW0/d2luZG93Lk9PLlFsLiRtLlltLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5yKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuemUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5PKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkopKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMueWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbM107dGhpcy5WcD10aGlzLmFbN107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5Jcj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e1RpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VaTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmhqOnRoaXMuSHIoYSl9LEhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLlNxfHxnYixMYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5UaSg0KTsoZnVuY3Rpb24oYyl7Yy5laj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuUmcoKX0sUmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxOYTpmdW5jdGlvbigpe3RoaXMuemgoKX0semg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSwKVTpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5lanx8aGI7KGZ1bmN0aW9uKGMpe2MuZGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sa2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5yYSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5rZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmtnKGEpfS5iaW5kKHRoaXMpKTsKYi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5IKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5kanx8aWI7KGZ1bmN0aW9uKGMpe2MuZmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxDaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KGIuRWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuWXB8fCh0aGlzLllwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5manx8amIsVT1uZXcgamIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuS249dGhpcy5hWzEwXTt0aGlzLkdqPXRoaXMuYVszXTt0aGlzLkVpPXRoaXMuYVs1XTt0aGlzLkR0PXRoaXMuYVsxMF07dGhpcy5Oaj10aGlzLmFbMTBdO3RoaXMuWGk9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5hcz1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLkZwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS246dGhpcy5GaihhKX0sRmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FaTp0aGlzLkN0KGEpfSxDdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRHQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5YaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuYXN8fGtiLE1jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkVwKDQpOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE9jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LApVOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBWPWMuZ218fFY7KGZ1bmN0aW9uKGMpe2MuZm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5hZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guYWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7eC5hZCgiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSCgpfS5iaW5kKHRoaXMpKTt4LmFkKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkgoKX0uYmluZCh0aGlzKSk7CnguRnEoKX0senM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLm1wKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk8oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSik7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk8oZCl8fCh0aGlzLlIoZCksZj1uZXcgVyhkLHRoaXMuSiksCmYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sYWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sY3Y6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLll0KCkmJih0aGlzLmdmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEZxOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9CjA7Yjx0aGlzLktjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuS2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmN2KGIpfX0pfSkoYyk7dmFyIGxiPWMuaG18fGxiLHg9bmV3IGxiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuJHE9dGhpcy5hWzRdOwp0aGlzLmo9dGhpcy5hWzVdfWMuUHE9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnduOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuUHF8fG1iLE5jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnZuKDQpOyhmdW5jdGlvbihjKXtjLmFqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEJhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5hanx8bmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCJub0FkIiwicGxheWVkIik7dGhpcy5IKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkgoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuYmp8fApvYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTyhnKXx8KHRoaXMuUihnKSwobmV3IG9iKGcsdGhpcy5KKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuVCgpfSxPOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTWFbYi5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmNqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW89dGhpcy5hWzVdO3RoaXMuZW09dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzNdO3RoaXMub209dGhpcy5hWzNdO3RoaXMuR3I9dGhpcy5hWzFdO3RoaXMuTXI9dGhpcy5hWzNdO3RoaXMuQXY9dGhpcy5hWzRdO3RoaXMuYXE9dGhpcy5hWzEwXTt0aGlzLmF1PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuQW09YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lbTp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmw6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMub206dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Hcjp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkF2OnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcTp0aGlzLiR0KGEpfSwkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLkFtfHxyYixPYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy4kbig0KTsoZnVuY3Rpb24oYyl7Yy5xbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExOwp0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuTnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sTnQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJgp0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sYWg6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxVOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5xbHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYiwKYSk7dGhpcy5vaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5vaSYmKHRoaXMuSCgpLHRoaXMub2k9ITAsdGhpcy5uYSgpKTthLkphKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSCgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5KKSkuZygpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpOwp2YXIgdWI9Yy5ybHx8dWIsWD1uZXcgdWIocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2o9dGhpcy5hWzFdO3RoaXMuRXI9dGhpcy5hWzFdO3RoaXMuc2s9dGhpcy5hWzZdO3RoaXMubGs9dGhpcy5hWzhdO3RoaXMuT3E9dGhpcy5hWzEwXTt0aGlzLmlvPXRoaXMuYVs2XTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkVqPXRoaXMuYVs0XTt0aGlzLlBuPXRoaXMuYVsxMF07dGhpcy5haz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxXX1jLlVzPWI7Yi5wcm90b3R5cGU9e25qOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub2o6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVyOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zazp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubGs6CnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PcTp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaW86dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlwOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLk5uKGEpfSxObjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuJGooYSl9LCRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLFBjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLm5qKDQpOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sVTpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLkhtfHx3YjsoZnVuY3Rpb24oYyl7Yy5HbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSwkYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTHQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMud2M9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuRGE/dGhpcy5MdCh0aGlzLkRhKToodGhpcy5EYT10aGlzLiRiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuRGEpe3RoaXMuSCgpO3JldHVybn1pZighdGhpcy53Yyl7dGhpcy5IKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmCnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLkdtfHx4YjsoZnVuY3Rpb24oYyl7Yy5JbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5PKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLkltfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm49dGhpcy5hWzFdO3RoaXMuQnQ9dGhpcy5hWzRdO3RoaXMuQ3I9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17RW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZuOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CdDp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLk1wfHxBYixRYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuRW4oNCk7KGZ1bmN0aW9uKGMpe2MuWGw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnN0KCl9LmJpbmQodGhpcyksNTAwKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYKKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuYWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxOdTpmdW5jdGlvbigpe3RoaXMuYWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5YbHx8QmI7KGZ1bmN0aW9uKGMpe2MuV2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5jPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLiRyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5uY3x8KHRoaXMubmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIik7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5uY3x8dGhpcy5uYysrLHRoaXMubmM8PXRoaXMuJHI/KHRoaXMubmMrKywKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5OdSgpLHRoaXMuSCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQ2I9Yy5XbHx8Q2I7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksCnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5KKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5ZbHx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm90PXRoaXMuYVsxMF07dGhpcy51cj10aGlzLmFbNV07dGhpcy5HaT10aGlzLmFbMTBdO3RoaXMueG89dGhpcy5hWzldO3RoaXMuU2w9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy5pbT1iO2IucHJvdG90eXBlPXtudDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub3Q6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVyOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HaTp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueG86dGhpcy5SbChhKX0sClJsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TbDp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmltfHxGYixSYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5udCg0KTsoZnVuY3Rpb24oYyl7Yy5WbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLlZsfHxHYjsoZnVuY3Rpb24oYyl7Yy5VbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLlRvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuQ2IoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLktyKCk6dGhpcy5tZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLAp0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxUbzpmdW5jdGlvbigpe3RoaXMuVWYoKXx8dGhpcy5tKCEwKX0sS3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNiKCk7IWIucWEmJmIuWSYmYi5neCYmYi5peCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYigpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwKMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9Yy5WYy5DYigpLGE9dGhpcy5nZXRQbGF5ZXIoKS5KYSgpLmlkLGU9MDtlPGIubGVuZ3RoO2UrKyliW2VdLmlkPT1hJiYodGhpcy51aD1iW2VdKTtyZXR1cm4gdGhpcy51aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5IKCEwKTp0aGlzLkgoKTp0aGlzLkgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5VbHx8SGI7KGZ1bmN0aW9uKGMpe2MuVmM9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxFbzpmdW5jdGlvbihiKXtiPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IEhiKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPWMuVmMuQ2IoKTtpZihiJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLkVvKGJbYV0pO3RoaXMuVCgpfX0pO2MuVmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGI9bS5wbGF5ZXJhcGkoKSkmJmIubGVuZ3RoKXJldHVybiBiO3ZhciBiPVtdLGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihhJiZhLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uZmVybW9kO2QmJmIucHVzaChkKX1pZihiJiZiLmxlbmd0aClyZXR1cm4gYn1iPVtdO2lmKChhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYS5sZW5ndGgpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS5mZXJtb2QmJmIucHVzaChhW2NdLmZlcm1vZCksCmFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGFbY10mJmFbY10ucGFyZW50RWxlbWVudCYmYVtjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYi5wdXNoKGFbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYiYmYi5sZW5ndGgpcmV0dXJuIGJ9cmV0dXJuW119fSkoYyk7dmFyIEliPWMuVmN8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy5KbD1iO2IucHJvdG90eXBlPXtXcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy5KbHx8S2IsU2M9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuV3EoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuYmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxPYzpmdW5jdGlvbigpe3JldHVybiEwfSxKYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOgpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuWmt8fFk7KGZ1bmN0aW9uKGMpe2MuWWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuYmY9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5iZj1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLmJmJiZiIT10aGlzLmJmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUudmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSwKdGhpcy5IKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuSCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuWWt8fFo7KGZ1bmN0aW9uKGMpe2MuJGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5tYXx8dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5tYT90aGlzLmdmKCk6dGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IFooYix0aGlzLkopLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuJGt8fExiLE1iPW5ldyBMYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuc289dGhpcy5hWzEwXTt0aGlzLlZrPXRoaXMuYVsyXTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLk1uPQp0aGlzLmFbNl07dGhpcy5ncz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy52bz1iO2IucHJvdG90eXBlPXt2azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2s6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLnd3KGEpfSx3dzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHc6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmttOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nbjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnZvfHxOYixUYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudmsoNCk7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxldTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxCYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxVOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEV4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuWWp8fE9iOyhmdW5jdGlvbihjKXtjLlhqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuamcoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0samc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGFbY10pO2IuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGIpe2lmKG51bGw9PWIpdGhpcy5qZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBiKWlmKGImJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0udmFzdEVycm9yQ29kZSYmKGI9YlthXS52YXN0RXJyb3JDb2RlKTtlbHNlIGImJmIudmFzdEVycm9yQ29kZSYmKGI9Yi52YXN0RXJyb3JDb2RlKTsxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9fSxtOmZ1bmN0aW9uKGIpe3RoaXMuSChiKX19KX0pKGMpOwp2YXIgUGI9Yy5Yanx8UGI7KGZ1bmN0aW9uKGMpe2MuWmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubWF8fHRoaXMuTyhjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5KKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlpqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTm09dGhpcy5hWzVdO3RoaXMucW09dGhpcy5hWzRdO3RoaXMud3U9dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzhdfWMuQm49YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xbTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnd1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5Cbnx8U2IsVWM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuTW0oNCk7KGZ1bmN0aW9uKGMpe2MuU209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PQphLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LFBkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxNdDpmdW5jdGlvbigpe3RoaXMuVGM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5UY3x8KHRoaXMuVGM9ITAsdGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGEpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5QZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuVGMmJih0aGlzLlBkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuVGM9ITEpLHRoaXMuUGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sVTpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLlNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5SbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEaDpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7Yj8oYiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLldiKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuV2IoYSl9LmJpbmQodGhpcykpKSxiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5XYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGguYmluZCh0aGlzKSwxMCl9LFdiOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuZW49ITAsMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLmVufHx0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxRZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5XYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuUWYoKTt0aGlzLlB0KCl9LFB0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGIpe3RoaXMuV2IoYil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuS3Q9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5XYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5SbXx8VWI7KGZ1bmN0aW9uKGMpe2MuVG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk8oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFViKGIsCnRoaXMuSiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLlRtfHxWYixXYj1uZXcgVmIoaGEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLkJsPXRoaXMuYVs5XTt0aGlzLmdsPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs0XTt0aGlzLlBzPXRoaXMuYVszXTt0aGlzLlZuPXRoaXMuYVsyXTt0aGlzLlhuPXRoaXMuYVs2XTt0aGlzLkxtPXRoaXMuYVsyXTt0aGlzLldqPXRoaXMuYVsxMF07dGhpcy56dD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxMF19Yy5Jaj1iO2IucHJvdG90eXBlPXtJcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSnA6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5CbDp0aGlzLmZsKGEpfSxmbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmdsOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kczp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBzOnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wbjp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWG46dGhpcy5LbShhKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxtOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Xajp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLklqfHxYYixWYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MudG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy54aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmtzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSwKZXU6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFU6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLk5kKGIpfS5iaW5kKHRoaXMpKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMueGgmJih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIFA9Yy50bXx8UDsoZnVuY3Rpb24oYyl7Yy5zbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxEYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy52ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCl9LmJpbmQodGhpcyksMTApfSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLnNtfHxROyhmdW5jdGlvbihjKXtjLnVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgUCh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTyhiKXx8KHRoaXMuUihiKSxiPW5ldyBRKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuZ2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLnVtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9CnRoaXMuYVs2XTt0aGlzLm1zPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVsxXTt0aGlzLkJrPXRoaXMuYVsyXTt0aGlzLlJuPXRoaXMuYVs0XTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVs0XTt0aGlzLkhuPXRoaXMuYVsxMF07dGhpcy5jaz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLkluPWI7Yi5wcm90b3R5cGU9e2xsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbDp0aGlzLmxzKGEpfSxsczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXM6dGhpcy5XayhhKX0sV2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhrOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bToKdGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkhuOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuSW58fCRiLFdjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLmxsKDQpOyhmdW5jdGlvbihjKXtjLkxrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LApVOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkxrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkhjPXRoaXMuRGE9dGhpcy5jZD0hMTt0aGlzLkJoPWUuTGIoMTApO3RoaXMuZ2goKX0sZ2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5zYigpLCEwO3RoaXMuWGcrKztpZigxMDx0aGlzLlhnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2guYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5IKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLktrfHxiYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk8oYil8fCh0aGlzLlIoYiksYj1uZXcgYmEoYix0aGlzLkopLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5PKGIpfHwodGhpcy5SKGIpLGI9bmV3IGJhKGIsdGhpcy5KKSxiLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuTWt8fGFjLGJjPW5ldyBhYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kdT10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbNV07dGhpcy5LcT10aGlzLmFbNV07dGhpcy5lcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs1XX1jLndpPWI7Yi5wcm90b3R5cGU9e2N1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZHU6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuSnEoYSl9LApKcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy53aXx8Y2MsWGM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuY3UoNCk7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUGp8fGRjOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmxnKCl9LGxnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5IKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Panx8ZWM7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk8oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5KKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Ranx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVs3XTt0aGlzLmNtPXRoaXMuYVs0XTt0aGlzLnVqPXRoaXMuYVs4XTt0aGlzLlV2PXRoaXMuYVs1XTt0aGlzLnl2PXRoaXMuYVs1XTt0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy55aj10aGlzLmFbMl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLlZxPWI7Yi5wcm90b3R5cGU9e2JyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuY3I6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNtOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudWo6dGhpcy5UdihhKX0sVHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlV2OnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy55djp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlqOnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vdzp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLlZxfHxoYyxZYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuYnIoNCk7KGZ1bmN0aW9uKGMpe2Muc2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFU6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMuc2l8fGljOyhmdW5jdGlvbihjKXtjLnJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwpiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm9lKCk7dGhpcy5oZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGhnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9CiJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6CnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9lLmJpbmQodGhpcyksMTAwKX0sb2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5vZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSChiKX19KX0pKGMpO3ZhciBqYz1jLnJpfHxqYzsKKGZ1bmN0aW9uKGMpe2MudGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTyhiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5KKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnRpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHA9dGhpcy5hWzJdO3RoaXMuRms9CnRoaXMuYVs5XTt0aGlzLk1pPXRoaXMuYVs3XTt0aGlzLm1tPXRoaXMuYVsxMF07dGhpcy5JaT10aGlzLmFbMl07dGhpcy5Fdz10aGlzLmFbNl07dGhpcy5Iaz10aGlzLmFbOF07dGhpcy5Xcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs2XX1jLnlzPWI7Yi5wcm90b3R5cGU9e2dwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ocDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaTp0aGlzLmxtKGEpfSxsbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubW06dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklpOnRoaXMuRHcoYSl9LER3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGs6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYz1jLnlzfHxtYyxaYz1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ncCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5paD10aGlzLmtoPXRoaXMuamg9ITE7dGhpcy5BZD1bXTt0aGlzLmZmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBKYj9udWxsOkpiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBNYj9udWxsOk1iLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgV2I/bnVsbDpXYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUmI/bnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBsYz9udWxsOmxjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5NbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnhxKGEpOltdLGI7dGhpcy5raD0hMDtpZihhLmxlbmd0aCl7dGhpcy5qaD0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5KaChiKX1lbHNlIGZvcihjIGluIHRoaXMuZmYpe2lmKHRoaXMuaWgpYnJlYWs7Yj10aGlzLmZmW2NdO3RoaXMuQWYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5KaChiKSl9fSxBZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LHhxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmZmW2NdLHRoaXMuQWYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy5BZihhKSYmCmEuZygpfSxQdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuamgpZm9yKHRoaXMuaWg9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uUGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5QYil9fX0pKGMpO3ZhciBuYz1jLk1sfHxuYyxOPW5ldyBuYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dz10aGlzLmFbMV07dGhpcy5WbT10aGlzLmFbNF07dGhpcy51cD10aGlzLmFbNV07dGhpcy5BcD10aGlzLmFbNF07dGhpcy5DaT10aGlzLmFbMl07dGhpcy5xcD10aGlzLmFbNl07dGhpcy5Bcj10aGlzLmFbNl07dGhpcy5xdD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnJtPWI7Yi5wcm90b3R5cGU9e3V3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52dzp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLlZtOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXA6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNpOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xcDp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXI6dGhpcy5wdChhKX0scHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ybXx8b2MsJGM9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMudXcoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YKUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRWMoay5HdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuRWMoay5zcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgYWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSj1uZXcgSyxtPSExO0ouamEoKTtKLmJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSi5qYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEouYmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtKLmphKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS5DZyh3aW5kb3csSi5kcigpLHtpZDpiZH0pfSw1MDApLGphPWUuYWEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3c9dGhpcy5hWzEwXTt0aGlzLlBtPXRoaXMuYVs1XTt0aGlzLnZzPXRoaXMuYVs4XTt0aGlzLlJxPXRoaXMuYVsxXTsKdGhpcy5Odj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5RbT1iO2IucHJvdG90eXBlPXtCdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3c6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJxOnRoaXMuTXYoYSl9LE12OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Odjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuUW18fHBjLGNkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLkJ3KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy55aD10aGlzLmNvbmY9CnRoaXMub2I9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5lYj0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLkFoPSExO3RoaXMuY2Y9W107ZS5xYigibmV3QWRkZWxpdmVyeSIpfWMudWk9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxtZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuVSgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGh1OmZ1bmN0aW9uKGEpe3RoaXMub2I9YX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LElhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sUGM6ZnVuY3Rpb24oYSxiKXtlLnZhKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm9iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuZXIoKSl0aGlzLm9iLmwodGhpcy5vYi5zZCx0aGlzLm9iLnlhLHRoaXMub2IuZWYsZnVuY3Rpb24oKXt0aGlzLlBjKGEsYil9LmJpbmQodGhpcyksdGhpcy5vYi5EYyk7ZWxzZSBpZih0aGlzLkhxKCkpdGhpcy5idShmdW5jdGlvbigpe3RoaXMuUGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLkJjLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnFiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBSYShsLHRoaXMub2IsZyk7bC5mdSh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWnIoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5LZSYmKGM9dGhpcy5wbGF5ZXIuS2UoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTmUoYSxjLGYpO3RoaXMucGxheWVyLkxoKGwpfX0sZXI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy53ZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLndkLmdldFRpbWUoKSx0aGlzLndkPWEsM0U1PGI/ITA6ITE7dGhpcy53ZD1hO3JldHVybiExfSxGdTpmdW5jdGlvbigpe2UucWIoInByZXJvbGwiKTsKZS5sZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSWEoImFkVGFnIik7dGhpcy5JYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnlnKGEpKT90aGlzLlBjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9LEV1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmxmKCJwb3N0cm9sbCIpO2UucWIoInBvc3Ryb2xsIik7dGhpcy5tdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy55ZyhjKSk/dGhpcy5QYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuamQsdGhpcy5wbGF5ZXIucygpKSl9fSx5ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sU3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50dSh0aGlzLkV1LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEdkOmZ1bmN0aW9uKGEpe2UucWIoIm1pZHJvbGwiKTtlLmxmKCJtaWRyb2xsIik7aWYoIXRoaXMub2gpe3RoaXMub2g9ITA7dmFyIGI9dGhpcy5JYSgiYWRUYWciKTt0aGlzLklhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5JYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuUGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmpkLHRoaXMucGxheWVyLnMoKSkpfX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdSh0aGlzLkdkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlFlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZ1KCk7dGhpcy5wbGF5ZXIuUWUmJnRoaXMuUnQoKTt0aGlzLlN0KCl9LFR0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuQmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5DZD10aGlzLkJkLmxlbmd0aH0sSHE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LGJ1OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy53dC5iaW5kKHRoaXMpKX0sd3Q6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuY2YucHVzaChhKTswPj10aGlzLkNkJiZ0aGlzLkFoKCl9LFpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmNmLmxlbmd0aDtjKyspYj10aGlzLmNmW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLnVpfHxnYSxTPSExLG5hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLkRrPXRoaXMuYVsxMF07dGhpcy5abz10aGlzLmFbM107dGhpcy5PaT10aGlzLmFbM107dGhpcy5Ccz10aGlzLmFbMV07CnRoaXMuTHA9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzddO3RoaXMuanM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMV19Yy5UbD1iO2IucHJvdG90eXBlPXtJdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnc6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkRrOnRoaXMuWW8oYSl9LFlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5abzp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2k6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJzOnRoaXMuS3AoYSl9LEtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5McDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJHM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9CmMuVGx8fHFjLGRkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLkl3KDQpfSkuY2FsbChkYWlYZWVwaWtlZVR1bmdlLGRhaVhlZXBpa2VlVHVuZ2UpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.158.18 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.18.158.9.5.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 07 Nov 2019 09:44:56 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://www.golem.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
110
runner.html
tpc.googlesyndication.com/sodar/sodar2/204/ Frame F4B1
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/204/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/204/runner.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/78.0.3904.70 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
4595
date
Thu, 07 Nov 2019 09:05:10 GMT
expires
Fri, 06 Nov 2020 09:05:10 GMT
last-modified
Tue, 08 Oct 2019 15:04:09 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2386
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
gen_204
pagead2.googlesyndication.com/pagead/ Frame BBFE
0
59 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=204&t=2&li=gpt_2019103101&jk=1268103029909341&bg=!VlWlVU1Y49WB6hrruTUCAAAAa1IAAAAQmQFeOTZLwyhjY_5HMggDE-NWNcD-QMl9fdM83hahRBiH_pwbl2hd38u6HFQB1r_DMYgp00mSmoxONzUGdvLGTlXfQOga_WfCFy0zoGNH3folntb56h0_Lf_5GiDsJ2MpR92wUVi1GUSa1MhCyFlV2bNCis7RCTK80CFHNBXec30g5lSOQ_uFp1kf1xIDt7mJvGb_NOezyba9LFAJpe-pJTuCCW8qWdfAmgbjgKJsgAPsUi0FS_06B-mqVcuWBwztJ78HMDF9H5EcmuLs2A0UvN2XpwYlnE5tPsBigPnbbN9TgEPdKHw0ODdA2ioagZmj3bx90Y50x6y34eGzVF0L9tgfImrScABl7CszVk2ukdAfZOzMRwR75EFVp-hHZWufcFD9osFUKHFUMKVNKNgW0ZePx0fISsIptTuZgjbDIMmWZDRVYVSRUFMlhcgFMPGA4u6YY81U0ceodHlzXsBEthM
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:56 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 2671
42 B
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssvqplY2l2WjhyxgoSo3YYKZ0Yk24KQob07NId0ajDoLKBrkTqXtMd_QmsqlM4t8ModjhlHRMzEv6FCceFefHhFfcD2Qmv68j5fEXBTRv0&sig=Cg0ArKJSzOTKaSucx83oEAE&adk=2740773112&tt=-1&bs=1585%2C1185&mtos=1054,1054,1054,1054,1054&tos=1054,0,0,0,0&p=1028,993,1153,1293&mcvt=1054&rs=3&ht=0&tfs=781&tls=1835&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=651&niot_cbk=679&md=2&lm=2&rst=1573119895598&rpt=64&isd=0&msd=0&oseid=3&xdi=0&ps=1603%2C12235&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-41-15-15-146-13-0-0-0&tvt=1836&r=v&id=osdim&vs=4&uc=8&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191104
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:56 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqGuABAUkzF2BPWAAAAAAAAB0G/APBAAFAA0G/TZyOAPAAAAAAAAABZyOAZFAAOA55A55A85B55A58E55A55AGAy1A40A40ArZyOAPNAAAAAAAAIZyOAPBAAAAAAAAIhRjASksFFGjAAAAAAAAAAAAEAAA0G/AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdAAAAAAAAAAAAFAAAZyOAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF4/p3SA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:57 GMT
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqHuABA/k0FiRmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A51A21A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw1A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw4A4mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13AzxAx5A45A44A32ATkzFARksFAQtjFdnwtZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:57 GMT
[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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.105 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-105.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
2b2e8c0c31f3667eb8532f9a48a5b988857b87b5bffbb58f54c8d763c6fe90e1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:45:00 GMT
content-encoding
gzip
last-modified
Wed, 23 Oct 2019 14:59:34 GMT
server
AmazonS3
x-amz-cf-pop
FRA2-C1
etag
"6ef38ae4d4a7e78a7a6e159131ba13e3"
x-cache
Hit from cloudfront
content-type
application/javascript; charset=UTF-8
status
200
cache-control
no-cache
accept-ranges
bytes
content-length
851
via
1.1 3df1d6f6e1999cb29078ddff1a62bd1d.cloudfront.net (CloudFront)
x-amz-cf-id
XF-7Lm8-fKULKg_yoWPqmwIni5lMjOYV7zqf_DpYkYsaC9-y4K9xtw==
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqITCBALlnFEUkzFYBPOrAAAAAAABYMhAPBAAFAAYMhT9HWAPAAAXUAKAAB9HWAZBAAOA55A55A85B55A58E55A55AGAxzA15A2wAr9HWASksFjGjAAAAAAAAAAAAEAAAYMhAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFDAzrF5BFEAu1FssFEAu1FssFxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAA9HWAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAz2AvoE0tFsvBjvFu0FhpFulFyuBo0FtsFKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFQOk7SA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:57 GMT
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqJTCBA/k0FeVmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A51A21A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw1A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAxxA54A52Aw4A4mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13AzxAx5A45A44A32AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA13AzxAx5A45A45A33ATkzFARksFAQtjFXHSedA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:58 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:57 GMT
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
360E6D5F866269BE
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Thu, 07 Nov 2019 09:44:59 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
0lnSitnLCeETXaxn9OVbpvWcDygso97eVVZzAWSam171iPiaRMejLG2fjoLwd4swTdteaUST7rI=
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=98326618
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.109 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:59 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 07 Nov 2019 09:49:59 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.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

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Thu, 07 Nov 2019 09:44:59 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 18:52:32 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Wed, 13 Nov 2019 20:14:02 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:59 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
Cookie set map
ih.adscale.de/ Frame 70C2
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=d85696fc2f284caca01ce4f70504c34d
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=d85696fc2f284caca01ce4f70504c34d
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=d85696fc2f284caca01ce4f70504c34d
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Thu, 07 Nov 2019 09:44:59 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:59 GMT
Content-Length
627
Connection
keep-alive
Set-Cookie
tu=4#3024058821#48~~436977~436977~1#101~~436977~436977~1#38~~436977~436977~1#72~~436977~436977~1#42~~436977~436977~1#75~~436977~436977~1#60~~436977~436977~1#63~~436977~436977~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

Server
Apache-Coyote/1.1
Location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=d85696fc2f284caca01ce4f70504c34d
Content-Length
0
Expires
Thu, 07 Nov 2019 09:44:59 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:59 GMT
Connection
keep-alive
Set-Cookie
uu=d85696fc2f284caca01ce4f70504c34d; Domain=.adscale.de; Expires=Wed, 04-Nov-2020 02:11:39 GMT; Path=/
segments
api.theadex.com/v0.9/pub/
56 B
127 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Thu, 07 Nov 2019 09:44:59 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:9400:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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
3709249
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
Iffn-lOF5v-E7tEd5d0OcwhV7IdrSoW6rAGYBQI0nv7qJ0eTKtF1SA==
via
1.1 ef13dd533b8dc9dcfdc35449cf88f808.cloudfront.net (CloudFront)
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/c9e8ca97-9065-405b-8739-28adf16713ed/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.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

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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
154
date
Thu, 07 Nov 2019 09:42:29 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
hs7Gd19wQ9JMUP-s_djPb1kywjm5WWs-8APeQZPfVdMY74UENk6wbg==
via
1.1 59d92388a3a66e5f245f384a437fa025.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F78.0.3904.70%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=3caf9559c7017d8f5306fa8053af5311&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=728681867882
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
80588e46b2e8ec98ca5a16dda26d44d9f3505b48d13dbc9815e428a0ee439ede

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Thu, 07 Nov 2019 09:44:59 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.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

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Wed, 06 Nov 2019 17:14:05 GMT
Content-Encoding
gzip
Last-Modified
Wed, 06 Nov 2019 17:11:02 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 5C5F
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsU-ESJZESB8BsUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4208873600093318133
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4208873600093318133
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

status
200
date
Thu, 07 Nov 2019 09:44:59 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Thu, 07 Nov 2019 09:44:59 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4208873600093318133
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame 7127
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.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.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/78.0.3904.70 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Thu, 07 Nov 2019 09:44:59 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
data
lb7.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb7.s400.meetrics.net/data?/w/CqKKOBALlnFFUkzF2BPjBAAAAAAAByfWAPBAAFAAyfWTqYyAPAAA0EAMCABqYyAZBAAOA55A55A85B55A58E55A55AFA5yAx0A2BErqYyAPTAAXUAKAAH9HWAPAAA0EAMCAHqYyASksFpGjAAAAAAAAAAAAEAAAyfWAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFGAihFuuFlyFEAu1FssFEAu1FssF0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFd0EAMCAKPA6DAFAAAqYyAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAz2AvoE0tFsvBjvFu0FhpFulFyuBo0FtsFJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjF8uICTA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:44:59 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 07-Nov-19 09:44:58 GMT
usersync
uss.xplosion.de/
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=3caf9559c7017d8f5306fa8053af5311
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Thu, 07 Nov 2019 09:44:59 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1573119905044
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.115.112 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.112.115.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 07 Nov 2019 09:45:05 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Verdicts & Comments Add Verdict or Comment

174 JavaScript Global Variables

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

object| onformdata object| onpointerrawupdate object| Golem object| _gcpx string| _rngnafc boolean| _rngnaf string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| $ function| jQuery object| iAbo function| golemAcceptCookies object| adsbygoogle object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken number| google_srt object| google_ad_modifications object| google_logging_queue boolean| google_measure_js_timing object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| stroeerCore object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq boolean| deliveringAds boolean| subDomainCheckVar function| BSTDSdd object| rzhive04Flags string| rzhiv17fRnd object| rzhivdba2tc function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| gaGlobal object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag boolean| rzhiv5a4sdl boolean| rzhiv5a4sdln string| rzhivdba2genat string| rzhivdba2sthash boolean| rzhiv8beforceimp boolean| google_noFetch boolean| rzhivdfdBody boolean| rzhivdacDetect object| rzhiv4f1Mobile object| rzhivdba21 object| rzhivdba2o1 object| rzhivdba2o2 object| rzhivdba2o3 object| rzhivdba22 number| rzhivdba2d3 object| rzhivdba24 object| rzhivdba25 boolean| rzhiv1a1ij object| confiant object| google_tag_manager function| Swiper function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb string| GoogleAnalyticsObject function| ga object| rmp3pi function| SwfVideo object| exportz object| m object| ScTag146005 object| ScTagAdditional146005 object| axd2 object| s object| _adexc object| __io number| _m6rApiLoaded object| google_image_requests object| google_tag_data object| gaplugins object| gaData function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| _m6rOnce number| _m6rContainerLoaded function| _h object| adex string| _io_uniques_holing_params object| _google_rum_ns_ function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google object| closure_lm_264268 object| daiXeepikeeTunge number| D function| videopkgInterface object| closure_lm_215904 boolean| rzhivfc2Track string| hic_qos 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

2 Cookies

Domain/Path Name / Value
.doubleclick.net/ Name: IDE
Value: AHWqTUkLiD_bFPuh58DgKw3oTdtbRb-_3PXk6MwPXcIy8yDyanAbkik-s056MmX2
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImtkQzgiLCJ0c2wiOjE1NzMxMTk4OTgsIm52IjoxLCJ1cHQiOjE1NzMxMTk4OTQsImx0IjoxNTczMTE5ODk0fV0.

3 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1(Line 1)
Message:
No Cookie
console-api log URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js(Line 1)
Message:
build BB

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

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.yieldlab.net
ads.golem.de
adservice.google.com
adservice.google.nl
adstax-match.adrtx.net
adx.adform.net
api.theadex.com
bbcdn-bbnaut.ibillboard.com
c1.adform.net
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
cpx.golem.de
cpxl.golem.de
d.agkn.com
de-gmtdmp.mookie1.com
de.ioam.de
delivery.selfcampaign.com
dmp.theadex.com
ff.doubleclick.net
golem.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb7.s400.meetrics.net
lib.selfcampaign.com
match.adsrvr.org
nugmw.userreport.com
pagead2.googlesyndication.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
sak.userreport.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
ssl.3.damoh.golem.de
stats.g.doubleclick.net
templates.stroeerdigital.de
tpc.googlesyndication.com
track.selfcampaign.com
track2.selfcampaign.com
tracking.m6r.eu
tracking.yieldlove-ad-serving.net
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagmanager.com
www.googletagservices.com
xpl.theadex.com
104.109.82.87
108.128.71.27
13.224.196.105
13.224.196.116
13.224.196.120
13.224.196.46
136.243.12.39
136.243.2.136
136.243.94.77
148.251.131.173
148.251.69.233
151.101.13.194
172.217.21.194
172.217.23.162
185.33.223.209
188.40.115.112
2.16.122.151
2.18.233.67
2.18.234.72
2600:9000:2043:2600:1f:a1b:34c0:93a1
2600:9000:20eb:1e00:15:efbc:e300:93a1
2600:9000:2156:9400:1c:8c89:a300:93a1
2600:9000:21f3:2400:12:6213:9cc0:93a1
2606:4700:20::681a:2cd
2a00:13c8:f5::f:4b3d:148
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:806::2008
2a00:1450:4001:808::2002
2a00:1450:4001:809::2001
2a00:1450:4001:80b::2006
2a00:1450:4001:815::2002
2a00:1450:4001:81a::2006
2a00:1450:4001:81b::200a
2a00:1450:4001:81c::2002
2a00:1450:4001:821::200e
2a00:1450:400c:c00::9c
2a02:26f0:6c00:2bc::5f76
3.121.36.175
35.186.238.175
37.157.2.234
37.157.6.252
5.9.158.18
52.216.108.77
52.28.163.57
52.48.102.50
54.246.164.155
62.168.44.118
63.34.92.224
85.114.144.106
89.163.159.109
91.215.100.39
91.215.103.65
95.216.194.18
01c3e7f83d0dcbcb8efeb5730d85a7472b182415004852e96ad9995faaf625fc
039c78ec6eac9f8df6d46011f753983b2102fe3cd6e4eb1b763097d388853d75
03cc398bea70db2f6624fddd0412aeb8b70ed203ef2a48af1c7a57230e419525
04803ea62250e5b6be046376bf3ce7c7a288af79b157497b563f083d076985b4
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1
0766772b73649dee975dfbf6899d42eb7bef326ba870a679b5a1f5522dda03da
07b8ab33ab9d0a52b9bf08de9aeaa40920e6d979c62c954490538dcdb0df6bc4
08d851026bab1d4b8c1e46b8713c9a5821f7c5dcfd058735f9e036aac5197553
0ae091d6b529a28c0080dd4e376a97d1c246a0d9187095ef0242168b5d09d74b
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
127e7d6844c8f9fbff9d755d3b1722a81202d0c21511c8baace4ccf9c62b6a09
12ae952d6e680bfa2fcc28d2aa1d0e2acbd064c13da4d8e6d5adb47faa0559e6
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
14f1e5cd3945b27cef93055ecd0a2c3434ad517859f7454ebd99f51169021af8
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
168d5766d6ec1781d7bb7a8d59ef7683ded35400339f04f72352654acba7eab6
184bc3ef67282b95f8efea3032c6865ed299929a575859205cdf029385b9f4a4
1ae6ee501f2db1d64f9878b6abb03e3ca476df7651c92bff9cf443ec5edf0d3c
1e84c821b9ab797d576cad0f30d1d9fca9f860b034900df6f4851c8bde15229c
1f7d025e04209fddeb26e9bb7682439b215b5d60939785e128848d077314844e
1f7ea44014a85a60e4807e506aef94fef3d3b1fc98f61574afd16057c49a04f2
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
26dd08941fee81cf194d1a8fc023a00c89e87337c246d772191eae7053fea8a5
2a7e6fc006450b14245184f4a75379a30fa24f91859346a9774223ddb286d644
2b2e8c0c31f3667eb8532f9a48a5b988857b87b5bffbb58f54c8d763c6fe90e1
2de5e612c77760fbeeca70349af2f79e74fa83e8486e9bde43ed44146aa6c801
2f501b3d97d523fb7428b009ada5d4937b24fc2b8eee7660a12098717f071e4d
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34257afc86d550f106423cc3bb5ceceec8f9d2bae0e72da879b98fefc6ad9472
345bf169855f7a59f691910a42ae7b8be1dc7006cefac23c631b59e941c9b85c
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
3bc72d32aafe9690f879735e846215810846b9a942c38e0f9de8c280ba69eb43
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
420d78da234773b0c3e1d796a128d03a4a5570f583901a1d865fdd81c50a3f9b
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
434ef8f99f72547ad8fa9c22e5a61ba85b2752419ce609ad9a616f8202ff33b7
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
45ba7e6b8ac86ae14d4f9f3e29d816130cccb439f63c9a5cea16595bb4c991c4
48093f593e770d92ca7ec2afafc2afa5c20da1b35cb115bfb5bd86d95fa4e8fe
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4c3c8ac4998d395f04020c25d76a71146d53bff0192426705641e347e49480e1
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c
4fcc32abfa3753573f9e3f02ba91394bb66f8566c681ba0d42687a7abca38b1c
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
52005312e3adc941a2cfc6009e224e3dd017f53e7436650cb342100d144e6acb
525334785b998bc7826f462d6d361ac8f1337af6226f8460fa5ec6a349ec4369
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
564355608ada6e39d57fde85f6a5b270b21d555ea31d68e67bc4776bc3ba1ca5
564aea40bd7c495ca78015c65ff916ef761d0c5a294d15ad46c3a1cb214c73f4
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5cec58c4f5aa27aa79be6149814da34bec2b96e6049ffa30df37b69598f789ff
6046fc054dcedf23fc53f963107611fd97b73fd214d69e53591cb9c1120966a6
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a
62899a9c2ff2c26a31bffc73ced6ae508f6e48b980151d6276d39e8e4993cf74
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63682dd2c3752c64430139f625703b0031902e4d136e4a09e3d7c53e9c389631
6385759e7a0468a16443529573c86db7b6799a610105aca3ebb20dbb276acef5
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
64859de9a73bb505163d3478613f5bf01c6fc77941259bb3f6ee39b11b42a65d
68016130d233fb0238abe9d334b2cabced1896ee66a19ddcc38212ffe4acb3af
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7331d395483bd9c25ea43aa19dd5cbbe39f440106a449a8fc6dc59fcc4fe3e25
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
7bea6aef5347ca91dee24d09ae637f13cb96be4a41071b1abf970a7fed938d05
7bfb787459e6f1e03a5b06ba9bfd3b72245b901d540f2b672d1c52ca3aee4f4d
7facf44fcbf3a15175fcaf8453940a674944d11c5f79c37f0e3b644de6108ad3
80588e46b2e8ec98ca5a16dda26d44d9f3505b48d13dbc9815e428a0ee439ede
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
8653d5ec4c1d0492ab620a5ce53bc6caaa9b678fd387577fba693d6dc37355d6
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc
90fdc8d121b1f4a0d5b4035387b90148bdd6839cfa47a03aca4735bddacaa078
925893649edac6748f0cdd793483050add4533bc18839e92017949dc83062cdb
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a13785025557c4cfb5b9fe089b482cde5686fad03ce5ef829f9467d6df12152a
a49776f75ec24fc397ba3e9b0478d2f9e3634bb9deed79e7b814f94eb0a84718
a93110b72125bbfdf1f2d40aaa039beaa4908f1752b6cb19ef005f4bfcedf9bf
a9d362a8027789758b13c8f43484c36ad0b365a438bce7edad85ee44e5da72a2
aa4eed278e2cd09fc86bc7c301a64cb8210b3d42cfb033831fa1da600c91a799
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187
ac44428fc2414ce9fc40136bb9ec50345431c5ef7b21937b5e100974ef0ebd78
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe8d16cf5925e30773f6eb2467c337f28417b0e3da3c1afed4bc6fcff24992d
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b2dd5346518af23577e1fad81876a5f57ef1516282b9b3190f5696663ed9e55c
b32616aef40b25240a40cfebe9a815caa57fb8164147bd964a0a91e56596a4a3
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
bd26854a1183bb91b20374fd40531a4ec844f36ac69064696f365a6ba08647a4
bd595d15b14166de468948af0212265857b924966c2bfcbb52a83413d6070fcf
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c40da849aadb5b2bd0f5069f679021aa321ffcf3f8c5007c2ab9233016367101
c643cc4a9cea1ea968d7a0b00c588136de6c13eb7049512d5dd0c26dad4acf5e
cbb18993901cb5ba967785e6bf16dd0b466e28d387695cd5dbd0aac7ddf0081e
cc088978815c12f8d255e07052bc5eea16deb6248fea719c07e438ee1aa5e16c
cd3aaeda7bcb688b7912aa6ba9d502b2654eda372431f343f4f4b3fa04838b97
cf100d861ec596ebd57dccbc2ba486f3c2dcc6bed24fd32c0a8838c48e50ad1e
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
d92031b829c213036fbe7137f1ce5c8bd69ef1e3af6797c75e5a697c321b9e73
da4d0c64526408b9def0eb9b67e7f0c06d5831a02e4cb52c2481f9925dd80677
da784170a3525c383a522f7f09c9773525881261c1994518ed75a7fdb56fa41d
db509867424310e881a0226b260a933f9bc3a034ca53010a281e20b4f3020bf3
dbae19bf269f2cdd505927b2726c6347e86b1d6c168d0383d6d9e50add0edfac
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
e10f6bf3d2922089aa0bff2c9494003e3d7ba803f2e3602ca43fae72b854884c
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e33a0b1fbdf9a8edb2c4c400894fc263a5393cf8923bea786b9fa63703a892fd
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
e526543ee894a2f4179f55e57f6a7ef6f20de3c25b350c9257d8a99c1790829d
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e646ed57105c9937bff87823180da4052182e65d0066e1e78a16dc2d50cd4ffb
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e801417c99f2df504d727ca0c5072faffab528da26538ddf029e0bd32a342710
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ebe15d4a3d57846d0ab5443a1b9957ee909b6d4bbc9c20fa33feedff0db3dde7
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ecc50ee94e3e8c8057a22f8e131d4bb53e9add15df28aab399907816b2215b71
ed0571a6b86d59f69e0551fb4f9f1b5cad7b7aa610f02a53f65722c25aecc160
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f164b867ddfc48b4a9998907412aff4dfa4eeee4a3383d12bc8546b4d0fca65a
f7553762e3767d4d7b902733e48ecc5c08077e386bd5e5c20734f090309bdeda
f76d18045710dcd31bf1674f3b02db59a42b80136f3b1ed06f00105d982c4a74
f970caa6d45b0638848d1da199ead274a467879ea0ac4a16a5056c3925062782
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548